你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FreeRTOS osMessagePut()传递消息问题。

[复制链接]
xlunchun 提问时间:2019-8-2 11:55 /


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));


依然能正确接收,正确打印,我给整闷圈了,请高手帮忙解惑?
收藏 评论1 发布时间:2019-8-2 11:55

举报

1个回答
butterflyspring 回答时间:2019-9-16 10:20:51
查查语法,再调试调试吧

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版