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()创建函数。