用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
发送一个指针类型的吧
只有发送一个地址了,这样还得定义一个数组或者链表来做缓存。有点麻烦了。 :lol这点麻烦算是上事,起码有个思路先跑通。后续可以再考虑优化。 寒风飘飘 发表于 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; 可以传指针,v和*p是一样的,因为可以强制转换,都可以用,都是4个字节。 考虑到效率,都是用传指针的吧,转换回去就是了,如果要发送一个结构体如果是局部变量还要复制内存,多麻烦。 只有用osMailPut (osMailQId queue_id, void *mail);了
页:
[1]