CubeMx中FreeRTOS解析——Queue的定义

CubeMx 中生成的FreeRTOS系统对Queue的声明做了重新定义。

使用如下方法声明一个Queue 消息队列

1. 声明一个osMessageQDef_t 结构体变量

  /* Create the queue(s) */
  /* definition and creation of myQueue01 */
  osMessageQDef(myQueue01, 16, uint16_t);
  myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL);

osMessageQDef() 其实是一个宏定义,在文件cmsis.h文件中。

#define osMessageQDef(name, queue_sz, type)   \
const osMessageQDef_t os_messageQ_def_##name = \
{ (queue_sz), sizeof (type)  }

以上宏定义里,用到了连接符##,将构建出名字为os_messageQ_def_开头的一个osMessageQDef_t类型的结构体。该结构体内包含了queue消息长度queue_sz,以及消息元素item的大小item_sz.

/// Definition structure for message queue.
/// \note CAN BE CHANGED: \b os_messageQ_def is implementation specific in every CMSIS-RTOS.
typedef struct os_messageQ_def  {
  uint32_t                queue_sz;    ///< number of elements in the queue
  uint32_t                 item_sz;    ///< size of an item
  void                       *pool;    ///< memory array for messages
} osMessageQDef_t;

如上分析我们可以得知,osMessageQDef(myQueue01, 16, uint16_t);的操作类似于如下代码:

	const osMessageQDef_t os_messageQ_def_myQueue01=
	{ 
		(16), 
		sizeof(uint16_t)  
	};

2. osMessageCreate创建消息队列

myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL);
cmsis_os.c文件中,有osMessageCreate函数的原型

osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id)
{
  (void) thread_id;
  
#if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

  if ((queue_def->buffer != NULL) && (queue_def->controlblock != NULL)) {
    return xQueueCreateStatic(queue_def->queue_sz, queue_def->item_sz, queue_def->buffer, queue_def->controlblock);
  }
  else {
    return xQueueCreate(queue_def->queue_sz, queue_def->item_sz);
  }
#elif ( configSUPPORT_STATIC_ALLOCATION == 1 )
  return xQueueCreateStatic(queue_def->queue_sz, queue_def->item_sz, queue_def->buffer, queue_def->controlblock);
#else  
  return xQueueCreate(queue_def->queue_sz, queue_def->item_sz);
#endif
}

当我们未配置configSUPPORT_STATIC_ALLOCATION宏的时候,简化成如下:

osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id)
{
  (void) thread_id;
  return xQueueCreate(queue_def->queue_sz, queue_def->item_sz);
}

实际上 还是调用了FreeRTOS原生的创建函数xQueueCreate,而osMessageQ则是返回了我们前面定义的osMessageQDef_t 类型变量的名称。

#define osMessageQ(name) \
&os_messageQ_def_##name

总结

由上分析可知,cubuMx只是在创建Queue列队前,只是帮你声明了一个保存列队长度和大小的结构体变量,然后通过这个变量信息来调用xQueueCreate()创建函数。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kimiyang123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值