11887|2

155

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

关于CMSIS_OS中osMessageGet()函数返回的问题 [复制链接]

本帖最后由 liutogo 于 2015-7-15 08:18 编辑

看CMSIS_os的代码,觉得有点问题
  1. /**
  2. * @brief Get a Message or Wait for a Message from a Queue.
  3. * @param  queue_id  message queue ID obtained with \ref osMessageCreate.
  4. * @param  millisec  timeout value or 0 in case of no time-out.
  5. * @retval event information that includes status code.
  6. * @note   MUST REMAIN UNCHANGED: \b osMessageGet shall be consistent in every CMSIS-RTOS.
  7. */
  8. osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec)
  9. {
  10.   portBASE_TYPE taskWoken;
  11.   portTickType ticks;
  12.   osEvent event;
  13.   
  14.   event.def.message_id = queue_id;
  15.   
  16.   if (queue_id == NULL) {
  17.     event.status = osErrorParameter;
  18.     return event;
  19.   }
  20.   
  21.   taskWoken = pdFALSE;
  22.   
  23.   ticks = 0;
  24.   if (millisec == osWaitForever) {
  25.     ticks = portMAX_DELAY;
  26.   }
  27.   else if (millisec != 0) {
  28.     ticks = millisec / portTICK_RATE_MS;
  29.     if (ticks == 0) {
  30.       ticks = 1;
  31.     }
  32.   }
  33.   
  34.   if (inHandlerMode()) {
  35.     if (xQueueReceiveFromISR(queue_id, &event.value.v, &taskWoken) == pdTRUE) {
  36.       /* We have mail */
  37.       event.status = osEventMessage;
  38.     }
  39.     else {
  40.       event.status = osOK;
  41.     }
  42.     portEND_SWITCHING_ISR(taskWoken);
  43.   }
  44.   else {
  45.     if (xQueueReceive(queue_id, &event.value.v, ticks) == pdTRUE) {
  46.       /* We have mail */
  47.       event.status = osEventMessage;
  48.     }
  49.     else {
  50.       event.status = (ticks == 0) ? osOK : osEventTimeout;
  51.     }
  52.   }
  53.   
  54.   return event;
  55. }
复制代码

osMessageGet()函数最终返回的是osEvent event结构体(定义如下)

  1. /// Event structure contains detailed information about an event.
  2. /// \note MUST REMAIN UNCHANGED: \b os_event shall be consistent in every CMSIS-RTOS.
  3. ///       However the struct may be extended at the end.
  4. typedef struct  {
  5.   osStatus                 status;     ///< status code: event or error information
  6.   union  {
  7.     uint32_t                    v;     ///< message as 32-bit value
  8.     void                       *p;     ///< message or mail as void pointer
  9.     int32_t               signals;     ///< signal flags
  10.   } value;                             ///< event value
  11.   union  {
  12.     osMailQId             mail_id;     ///< mail id obtained by \ref osMailCreate
  13.     osMessageQId       message_id;     ///< message id obtained by \ref osMessageCreate
  14.   } def;                               ///< event definition
  15. } osEvent;
复制代码
问题是,osEvent event是作为局部变量在osMessageGet()中声明的,在osMessageGet()中获取消息队列中的消息并将消息填充到了event中,函数直接返回event让我很是不解。

这个返回应该是osEvent event结构体的指针吧,返回后osEvent event的生命周期应该已经结束了,这样返回有什么意义呢?

最新回复

event这个结构体,在消息队列中是用V,在邮箱中是用*p.返回的实际上是生产者的数据或指针。  详情 回复 发表于 2017-4-5 15:55
点赞 关注

回复
举报

31

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没看源码 调用osMessageGet的函数定义个osEvent类型的变量能获得osMessageGet函数里event的值
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
event这个结构体,在消息队列中是用V,在邮箱中是用*p.返回的实际上是生产者的数据或指针。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表