一、消息队列
在FreeRTOS中,消息队列的常用函数包括创建、发送、接收、删除和查看。以下是这些函数的基本使用方法:
创建消息队列:
#include "FreeRTOS.h" #include "queue.h" // 创建消息队列,返回消息队列句柄 QueueHandle_t xQueue = xQueueCreate(queue_length, item_size); queue_length:队列的长度,即可以容纳多少个消息。 item_size:每个消息的大小。
发送消息到消息队列:
// 发送数据到消息队列 BaseType_t xQueueSend(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait); xQueue:消息队列句柄。 pvItemToQueue:指向要发送的数据的指针。 xTicksToWait:发送等待的最大时间,设置为portMAX_DELAY表示一直等待。
接收消息从消息队列:
// 接收数据从消息队列 BaseType_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait); xQueue:消息队列句柄。 pvBuffer:接收数据的缓冲区指针。 xTicksToWait:接收等待的最大时间,设置为portMAX_DELAY表示一直等待。
删除消息队列:
// 删除消息队列 vQueueDelete(QueueHandle_t xQueue); xQueue:要删除的消息队列句柄。
删除消息队列:
// 删除消息队列 vQueueDelete(QueueHandle_t xQueue); xQueue:要删除的消息队列句柄。
查看消息队列状态:
// 获取消息队列中的消息数量 UBaseType_t uxQueueMessagesWaiting(const QueueHandle_t xQueue); // 获取消息队列的长度(容纳消息的总数) UBaseType_t uxQueueSpacesAvailable(const QueueHandle_t xQueue); xQueue:消息队列句柄。
1. xQueue:消息队列句柄。
二、CubeMX配置
时钟配置
LED配置
串口一配置
freertos配置
在任务和队列目录中,新建任务
生成工程
三、keil代码配置
usart.c
freertos中串口重定向
/* USER CODE BEGIN 0 */ #include "stdio.h" int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xFFFF); return ch; } /* USER CODE END 0 */
重定向之后,打开use MicroMicroLIB !!!
freertos.c
导入串口头文件 ,并声明外部重定向函数
/* USER CODE BEGIN Includes */ #include "usart.h" #include "stdio.h" extern int fputc(int ch,FILE *f); /* USER CODE END Includes */
定义消息队列句柄和消息结构
/* USER CODE BEGIN FunctionPrototypes */ // 定义消息队列句柄 QueueHandle_t xQueue; // 定义消息结构体 typedef struct { uint32_t data; //添加其他 数据 } MyMessage; /* USER CODE END FunctionPrototypes */
创建队列
/* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ // 创建消息队列 xQueue = xQueueCreate(10, sizeof(MyMessage)); /* USER CODE END RTOS_QUEUES */
默认任务
/* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ MyMessage message; for(;;) { // 创建一个消息 message.data =55; // 发送消息到消息队列 if (xQueueSend(xQueue, &message, portMAX_DELAY) == pdPASS) { // 操作成功 printf("send message ok!\r\n"); } osDelay(2000); } /* USER CODE END StartDefaultTask */ }
任务二
void StartTask02(void const * argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ MyMessage receivedMessage; for(;;) { // 接收消息从消息队列 if (xQueueReceive(xQueue, &receivedMessage, portMAX_DELAY) == pdPASS) { // 处理接收到的消息 // receivedMessage 包含了发送的消息数据 if(receivedMessage.data==55) { osDelay(200); printf("receive message %d",receivedMessage.data); } } osDelay(2000); } /* USER CODE END StartTask02 */ }
运行效果
链接: https://pan.baidu.com/s/1KdfB7-KOo3cPkU-OJeQAbA?pwd=5fge 提取码: 5fge