寒风飘飘 发表于 2016-9-12 11:14:15

用FreeRTOS,使用队列怎么发送一个结构体呢?osMessagePut有局...



在函数osMessageGet 只能返回一个4个字节啊。在xQueueReceive它只传了一个uint32_tv啊,只有四个字节。
那就限制了最大的数据就是四个字节了,感觉应该不会是这样啊,那么我怎么使用队列,发送一个12个字节的结构体呢?


osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec)
{
portBASE_TYPE taskWoken;
TickType_t ticks;
osEvent event;
...................
...............
else {
    if (xQueueReceive(queue_id, &event.value.v, ticks) == pdTRUE) {
      /* We have mail */
}
    return event;
}

typedef struct{
osStatus               status;   ///< status code: event or error information
union{
    uint32_t                  v;   ///< message as 32-bit value
    void                     *p;   ///< message or mail as void pointer
    int32_t               signals;   ///< signal flags
} value;   
union{
    osMailQId             mail_id;   ///< mail id obtained by \ref osMailCreate
    osMessageQId       message_id;   ///< message id obtained by \ref osMessageCreate
} def;                               ///< event definition


高二毛 发表于 2016-9-12 13:21:15

发送一个指针类型的吧

寒风飘飘 发表于 2016-9-12 16:54:59

只有发送一个地址了,这样还得定义一个数组或者链表来做缓存。有点麻烦了。

高二毛 发表于 2016-9-13 08:20:32

:lol这点麻烦算是上事,起码有个思路先跑通。后续可以再考虑优化。

Serval 发表于 2016-9-13 13:57:59

寒风飘飘 发表于 2016-9-12 16:54
只有发送一个地址了,这样还得定义一个数组或者链表来做缓存。有点麻烦了。 ...
union里有void *p,直接传指针也可以的吧?

typedef struct{
osStatus               status;   ///< status code: event or error information
union{
    uint32_t                  v;   ///< message as 32-bit value
    void                     *p;   ///< message or mail as void pointer
    int32_t               signals;   ///< signal flags
} value;

寒风飘飘 发表于 2016-9-13 14:20:57

可以传指针,v和*p是一样的,因为可以强制转换,都可以用,都是4个字节。

maiweiqi 发表于 2016-9-14 10:00:05

考虑到效率,都是用传指针的吧,转换回去就是了,如果要发送一个结构体如果是局部变量还要复制内存,多麻烦。

幸运四叶草 发表于 2019-11-5 23:47:31

只有用osMailPut (osMailQId queue_id, void *mail);了
页: [1]
查看完整版本: 用FreeRTOS,使用队列怎么发送一个结构体呢?osMessagePut有局...