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[8]; 假如aa的地址是0x20001110 aa[0]=0x39; aa[2] =0x12; aa[3] =0x89; aa[7] =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[8]数组改成aa[18];加了个aa[17]=0x39;然后发送, printf("\r\n event.mail_id. =%x ",*((uint8_t*)(event.value.p)+17)); 依然能正确接收,正确打印,我给整闷圈了,请高手帮忙解惑? |
查查语法,再调试调试吧 |