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

目录
相关文章
|
8月前
|
JSON 数据可视化 物联网
基于STM32和FreeRTOS的实时天气系统设计与实现【免费开源】
随着物联网(IoT)技术的发展,实时数据监测系统逐渐成为日常生活和工业环境中不可或缺的组成部分。其中,气象监测系统不仅可以提供温度、湿度、天气状况等信息,还可以通过数据分析为农业、城市管理和个人生活提供智能化建议。本项目以STM32F407为核心控制器,结合FreeRTOS实时操作系统和ESP8266 Wi-Fi模块,实现一套高可靠、实时更新的智能气象监测系统。同时,系统集成了计时功能,通过串口屏将实时数据可视化展示,为用户提供直观的操作体验。
基于STM32和FreeRTOS的实时天气系统设计与实现【免费开源】
|
8月前
|
传感器 数据采集 物联网
基于STM32和FreeRTOS的智能手环项目设计与实现【免费开源】
随着可穿戴设备的普及,智能手环逐渐成为健康管理、运动监测和生活便捷的重要工具。本项目旨在设计一款基于STM32微控制器和FreeRTOS实时操作系统的智能手环,具备心率监测、运动计步、睡眠分析以及蓝牙通信功能。通过FreeRTOS实现多任务调度,提高系统响应效率和资源利用率,同时保证低功耗设计,延长手环续航。
基于STM32和FreeRTOS的智能手环项目设计与实现【免费开源】
|
消息中间件 Web App开发 API
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
|
消息中间件 存储 API
|
中间件 编译器 调度
STM32cubemx对FreeRTOS的适配(工程模板配置)
STM32cubemx对FreeRTOS的适配(工程模板配置)
1589 0
STM32CubeMX FreeRTOS 互斥锁
STM32CubeMX FreeRTOS 互斥锁
764 12
STM32CubeMX FreeRTOS 任务的挂起和恢复
STM32CubeMX FreeRTOS 任务的挂起和恢复
559 12
STM32Cubemx FreeRTOS Event
STM32Cubemx FreeRTOS Event
430 11
STM32Cubmx FreeRTOS Timer
STM32Cubmx FreeRTOS Timer
205 10