一、消息队列
在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:要删除的消息队列句柄。
// 获取消息队列中的消息数量
UBaseType_t uxQueueMessagesWaiting(const QueueHandle_t xQueue); // 获取消息队列的长度(容纳消息的总数)
UBaseType_t uxQueueSpacesAvailable(const QueueHandle_t xQueue);
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