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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版