FreeRTOS osMessagePut()传递消息问题。
osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec) 信息info竟然被定义成了整形类型?11
osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec)\
#define osMessageQDef(name, queue_sz, type) \
const osMessageQDef_t os_messageQ_def_##name = \
{ (queue_sz), sizeof (type), NULL, NULL}
osMessageQDef(myQueue01, 16, uint32_t); item_sz被定义成了sizeof(uint32_t) 等于4;!
myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL);
若传递一个数组aa; 假如aa的地址是0x20001110
aa=0x39;
aa =0x12;
aa =0x89;
aa =0x99;
osMessagePut(myQueue01Handle,(uint32_t)aa,osWaitForever); 这样写可以理解,将数组地址强转成 uint32_t型
进入到函数内部又调用了 xQueueSend(queue_id, &info, ticks) 取info的地址,这个怎么理解, 他想干什么。info现在不应该是从(int32_t)aa转换来的常数吗,现在info=0x20001110,假如它的地址等于 0x20000000 .取到这个地址意味着什么?,用调试追踪到它传给的pvItemToQueue的地址是0x200010fc 值是*pvItemToQueue =0;
然后将这个地址传给了 const void * const pvItemToQueue
xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )
然后就从这个地址复制数据到队列了
prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
然后就是复制数据,是传值的。
( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );
然后用osMessageGet(myQueue01Handle,osWaitForever);获取信息,打印出的结果是正确的。
osEvent event;
/* Infinite loop */
for(;;)
{
osDelay(1);
// myQueue01Handle
event = osMessageGet(myQueue01Handle,osWaitForever);
printf("\r\n event.value.v =%x ",*((uint8_t*)(event.value.p)));
printf("\r\n event.value.v =%x ",*((uint8_t*)(event.value.p) +2));
printf("\r\n event.mail_id. =%x ",*((uint8_t*)(event.value.p)+3));
printf("\r\n event.mail_id. =%x ",*((uint8_t*)(event.value.p)+7));这个输出也是正确的,输出了0x99;
搞不明白的是,queue_itemSize=4,只有4字节的尺寸 却传递了8字节的数组,竟然能正确输出?
const void * const pvItemToQueue 是按 void* 类型传给memcpy函数的,那么下面是按字复制的吗?
( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );
extern _ARMABI void *memcpy(void * __restrict /*s1*/,
const void * __restrict /*s2*/, size_t /*n*/) __attribute__((__nonnull__(1,2)));
后来我又把aa数组改成aa;加了个aa=0x39;然后发送,
printf("\r\n event.mail_id. =%x ",*((uint8_t*)(event.value.p)+17));
依然能正确接收,正确打印,我给整闷圈了,请高手帮忙解惑?
查查语法,再调试调试吧:)
页:
[1]