目录
一、前言
本文将介绍FreeRTOS中,消息队列的使用。芯片选择STM32F103C8T6,通过STM32CUBMEX移植FreeRTOS后,进行本文内容的学习。
二、消息队列
2.1 什么是消息队列
消息队列是一种先进先出(FIFO, First In First Out)的数据结构,用于在任务或中断之间传递消息。在FreeRTOS中,消息队列可以存储有限数量的、大小固定的数据项。每个数据项被称为队列项目,队列所能保存的最大项目数量称为队列的长度。
2.2 消息队列的作用
消息队列主要用于任务间的数据交换和同步。通过消息队列,一个任务可以将数据发送到队列中,而另一个任务可以从队列中读取这些数据。这种方式使得任务间的通信更加灵活和高效。
三、STM32CUBEMX配置
3.1 创建消息队列
3.1.1 配置FreeRTOS
首先,按照之前文章中的教程,启用FreeRTOS,配置基本的RTOS工程。
3.1.2 添加消息队列
在FreeRTOS配置中,找到"Tasks and Queues"下的Queue选项,点击“Add”按钮添加一个新的消息队列。
3.1.3 配置队列参数
设置队列的名称、队列深度(即最大消息数)、消息大小(以字节为单位)以及分配方式(动态或静态)。
3.1.4 生成代码
配置完成后,点击“Project”菜单下的“Generate Code”按钮生成项目代码。
3.2 V1官方API函数
FreeRTOS提供了丰富的API函数来操作消息队列,主要包括以下几个(下述函数需使用CMSIS V1):
3.2.1 osMessageCreate
创建并初始化一个消息队列。
3.2.2 osMessagePut
向消息队列中发送一个消息。
3.2.3 osMessageGet
从消息队列中接收一个消息,并将其从队列中删除。这是常规的出队列方法。
3.2.4 osMessagePeek
从消息队列中查看一个消息,但不将其从队列中删除。注意:这里仅获取数据,但并不出队,所以其他任务仍然可以取出该数据。
3.2.5 osMessageDelete
删除一个消息队列。
3.3 V2官方API函数
本文中使用的是CMSIS V2,其与V1所使用的函数是不同的。
3.3.1 xQueueSend
向消息队列中发送一个消息。
3.3.2 xQueueSendToFront
从队首入队,这意味着该数据会优先出队。
3.3.3 xQueuePeek
从消息队列中查看一个消息,但不将其从队列中删除。
3.2.4 xQueueReceive
从消息队列中接收一个消息,并将其从队列中删除。这是常规的出队列方法。
四、代码实现
注意需要引入头文件:queue.h
打开编译后的代码,在freertos.c中我们可以发现CUBEMX使用osMessageQueueNew函数创建了一个消息队列。
我们让默认任务去写队列,让任务2去读队列。
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
data += 10;
xQueueSend(QueueDataHandle,&data,0);
printf("Put Data :%d \n",data);
osDelay(1000);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
uint32_t temp = 0;
xQueueReceive(QueueDataHandle,&temp,100);
printf("Get Data :%d \n",temp);
osDelay(1000);
}
/* USER CODE END StartTask02 */
}