STM32CubeMX FreeRTOS 消息队列

简介: STM32CubeMX FreeRTOS 消息队列

一、消息队列


在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

目录
相关文章
|
6月前
|
消息中间件 Web App开发 API
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
|
6月前
|
消息中间件 存储 API
|
4月前
STM32CubeMX FreeRTOS 互斥锁
STM32CubeMX FreeRTOS 互斥锁
162 12
|
4月前
STM32CubeMX FreeRTOS 任务的挂起和恢复
STM32CubeMX FreeRTOS 任务的挂起和恢复
103 12
|
4月前
STM32Cubemx FreeRTOS Event
STM32Cubemx FreeRTOS Event
38 11
|
4月前
STM32Cubmx FreeRTOS Timer
STM32Cubmx FreeRTOS Timer
47 10
|
4月前
STM32CubeMX FreeRTOS点亮LED
STM32CubeMX FreeRTOS点亮LED
78 10
|
4月前
|
编解码
STM32CubeMX FreeRTOS u8g2图片菜单制作
STM32CubeMX FreeRTOS u8g2图片菜单制作
130 8
|
6月前
|
传感器
基于STM32与FreeRTOS的四轴机械臂项目-3
基于STM32与FreeRTOS的四轴机械臂项目
基于STM32与FreeRTOS的四轴机械臂项目-3
|
6月前
|
传感器
基于STM32与FreeRTOS的四轴机械臂项目-2
基于STM32与FreeRTOS的四轴机械臂项目
基于STM32与FreeRTOS的四轴机械臂项目-2