30-消息队列

news2025/5/25 13:18:41

一、消息队列概述

        队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、 中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消息是空时,读取消息的任务将被阻塞,用户还可以指定阻塞的任务时间 xTicksToWait,在这段时间中,如果队列为空,该任务将保持阻塞状态以等待队列数据有效。

        当队列中有新消息时,被阻塞的任务会被唤醒并处理新消息;当等待的时间超过了指定的阻塞时间,即使队列中尚无有效数据,任务也会自动从阻塞态转为就绪态。

        消息队列是一种异步的通信方式。通过消息队列服务,任务或中断服务例程可以将一条或多条消息放入消息队列中。同样,一个或多个任务可以从消息队列中获得消息。当有多个消息发送到消息队列时,通常是将先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入消息队列的 消息,即先进先出原则(FIFO),但是也支持后进先出原则(LIFO)。

特性
FreeRTOS 中使用队列数据结构实现任务异步通信工作,具有如下特性:
  • 消息支持先进先出方式排队,支持异步读写工作方式。
  • 读写队列均支持超时机制。
  • 消息支持后进先出方式排队,往队首发送消息(LIFO)。
  • 可以允许不同长度(不超过队列节点最大值)的任意类型消息。
  • 一个任务能够从任意一个消息队列接收和发送消息。
  • 多个任务能够从同一个消息队列接收和发送消息。
  • 当队列使用结束后,可以通过删除队列函数进行删除。

二、常用函数接口


//头文件
#include "queue.h"

1.消息队列创建函数

 QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize);

功能描述:用于创建一个新的队列。
参数:
- uxQueueLength-队列能够存储的最大消息单元数目,即队列长度。
- uxItemSize-队列中消息单元的大小,以字节为单位,该大小设置非常重要,否则得到的数据不完整。

返回值:
成功-如果创建成功则返回一个队列句柄,用于访问创建的队列;
失败-如果创建不成功则返回NULL,可能原因是创建队列需要的 RAM 无法分配成功。

eg:
//创建消息队列,Q_LEN为4,Q_SIZE为32
g_queue = xQueueCreate(Q_LEN, Q_SIZE);

2.消息队列静态创建函数

QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,UBaseType_t uxItemSize,uint8_t *pucQueueStorageBuffer,StaticQueue_t *pxQueueBuffer );


功能描述:用于创建一个新的队列。
参数:
- uxQueueLength-队列能够存储的最大消息单元数目,即队列长度。
- uxItemSize-队列中消息单元的大小,以字节为单位。
- pucQueueStorageBuffer-指针,指向一个 uint8_t 类型的数组,数组的大小至少有uxQueueLength* uxItemSize 个字节。当 uxItemSize 为 0 时,pucQueueStorageBuffer 可以为 NULL。
- pxQueueBuffer-指针,指向 StaticQueue_t 类型的变量,该变量用于存储队列的数据结构。
返回值:
成功-如果创建成功则返回一个队列句柄,用于访问创建的队列;
失败-如果创建不成功则返回NULL,可能原因是创建队列需要的 RAM 无法分配成功。

3.用于向队列尾部发送一个队列消息

BaseType_t xQueueSend(QueueHandle_t xQueue,const void * pvItemToQueue,TickType_t xTicksToWait);


参数说明:
- xQueue-队列句柄。
- pvItemToQueue-指针,指向要发送到队列尾部的队列消息。
- xTicksToWait-队列满时,等待队列空闲的最大超时时间。
如果队列满并且xTicksToWait 被设置成 0,函数立刻返回。超时时间的单位为系统节拍周期,
常量 portTICK_PERIOD_MS 用于辅助计算真实的时间,单位为 ms。
如果 INCLUDE_vTaskSuspend 设置成 1,并且指定延时为 portMAX_DELAY 将导致任务挂起(没有超时)。

返回值:
消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL。

eg:
//往消息队列中发送消息
xReturn = xQueueSend(g_queue, send_buff, portMAX_DELAY );
if(xReturn != pdTRUE)
{
	printf("send failure\r\n");
}

4.在中断服务程序中用于向队列尾部发送一个消息

BaseType_t xQueueSendFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);


参数说明:
- xQueue-队列句柄。
- pvItemToQueue-指针,指向要发送到队列尾部的消息。
- pxHigherPriorityTaskWoken-如果入队导致一个任务解锁,
并且解锁的任务优先级高于当前被中断的任务,
则将*pxHigherPriorityTaskWoken设置成 pdTRUE,
然后在中断退出前需要进行一次上下文切换,去执行被唤醒的优先级更高的任务,
可提高实时性。从FreeRTOS V7.3.0 起,
pxHigherPriorityTaskWoken 作为一个可选参数,可以设置为 NULL。


返回值:
消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL。

5.向队列队首发送一个消息

BaseType_t xQueueSendToFront( QueueHandle_t xQueue,const void * pvItemToQueue,TickType_t xTicksToWait );


参数说明:
- xQueue-队列句柄。
- pvItemToQueue-指针,指向要发送到队列尾部的消息。
- xTicksToWait-队列满时,等待队列空闲的最大超时时间。
如果队列满并且xTicksToWait 被设置成 0,函数立刻返回。
超时时间的单位为系统节拍周期,常量 portTICK_PERIOD_MS 用于辅助计算真实的时间,
单位为 ms。如果 INCLUDE_vTaskSuspend 设置成 1,
并且指定延时为 portMAX_DELAY 将导致任务无限阻塞(没有超时)。

返回值:
消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL。

6.在中断服务程序中向消息队列队首发送一个消息

BaseType_t xQueueSendToFrontFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);


参数说明:
- xQueue-队列句柄。
- pvItemToQueue-指针,指向要发送到队首的消息。
- pxHigherPriorityTaskWoken-如果入队导致一个任务解锁,
并且解锁的任务优先级高于当前被中断的任务,
则将*pxHigherPriorityTaskWoken设置成 pdTRUE,
然后在中断退出前需要进行一次上下文切换,去执行被唤醒的优先级更高的任务。
从FreeRTOS V7.3.0 起,pxHigherPriorityTaskWoken 作为一个可选参数,可以设置为 NULL。

返回值:
消息发送成功成功返回 pdTRUE,否则返回 errQUEUE_FULL。

7.从一个队列中接收消息,并把接收的消息从队列中删除

BaseType_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait);


参数说明:
- xQueue-队列句柄。
- pvBuffer-指针,指向接收到要保存的数据。
- xTicksToWait-队列空时,阻塞超时的最大时间。如果该参数设置为 0,
函数立刻返回。超时时间的单位为系统节拍周期,
常量 portTICK_PERIOD_MS 用 于辅助计算真实的时间,单位为 ms。
如果 INCLUDE_vTaskSuspend 设 置成 1,并且指定延时为 portMAX_DELAY 
将导致任务无限阻塞(没有超时)。

返回值:
队列项接收成功返回 pdTRUE,否则返回 pdFALSE。

若接收完消息,不想删除,可以使用xQueuePeek函数。


eg:
//阻塞等待消息
xReturn = xQueueReceive(g_queue, recv_buff, portMAX_DELAY);
if(xReturn != pdTRUE)
{
	printf("send failure\r\n");
}

//记得给缓冲区清零
memset(recv_buff, 0, sizeof (recv_buff));

8.在中断中从一个队列中接收消息,并从队列中删除该消息

BaseType_t xQueueReceiveFromISR(QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxHigherPriorityTaskWoken);


参数说明:
- xQueue-队列句柄。
- pvBuffer-pxHigherPriorityTaskWoken
- pxHigherPriorityTaskWoken-在使用之前必须初始化成 pdFALSE。
如果API函数(即xQueueReceiveFromISR)导致一个任务解锁,
并且解锁的任务优先级高于当前运行的任务,则API函数(即xQueueReceiveFromISR)将*pxHigherPriorityTaskWoken设置成pdTRUE。在中断退出前,触发一次任务切换。pxHigherPriorityTaskWoken 作为一个可选参数,可以设置为NULL。

返回值:
队列项接收成功返回 pdTRUE,否则返回 pdFALSE。
若接收完消息,不想删除,可以使用xQueuePeekFromISR函数。

三、示例代码

1、任务与任务之间的源码

https://download.csdn.net/download/m0_63622771/90897081

2、任务与中断之间的源码

https://download.csdn.net/download/m0_63622771/90897085

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2385363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thinkphp6使用token+Validate验证防止表单重复提交

htm页面加 <input type"hidden" name"__token__" value"{:token()}" /> Validate 官方文档 ThinkPHP官方手册

AppAgentx 开源AI手机操控使用分享

项目地址: https://appagentx.github.io/?utm_sourceai-bot.cn GitHub仓库: https://github.com/Westlake-AGI-Lab/AppAgentX/tree/main arXiv技术论文:https://arxiv.org/pdf/2503.02268 AppAgentx是什么: AppAgentX 是西湖大学推出的一种自我进化式 GUI 代理框架。它通过…

Axure设计之带分页的穿梭框原型

穿梭框&#xff08;Transfer&#xff09;是一种常见且实用的交互组件&#xff0c;广泛应用于需要批量选择或分配数据的场景。 一、应用场景 其典型应用场景包括&#xff1a; 权限管理系统&#xff1a;批量分配用户角色或系统权限数据筛选工具&#xff1a;在大数据集中选择特…

电机控制储备知识学习(五) 三项直流无刷电机(BLDC)学习(四)

目录 电机控制储备知识学习&#xff08;五&#xff09;一、三项直流无刷电机(BLDC)学习&#xff08;四&#xff09;1&#xff09;软件方法控制电机转速2&#xff09;PWM概念和PWM的产生3&#xff09;转子位置检测和霍尔传感器的工作原理分析4&#xff09;霍尔传感器安装角度和电…

Java—— 网络爬虫

案例要求 https://hanyu.baidu.com/shici/detail?pid0b2f26d4c0ddb3ee693fdb1137ee1b0d&fromkg0 http://www.haoming8.cn/baobao/10881.html http://www.haoming8.cn/baobao/7641.html上面三个网址分别表示百家姓&#xff0c;男生名字&#xff0c;女生名字&#xff0c;如…

Baklib内容中台的主要构成是什么?

Baklib内容中台核心架构 Baklib作为一站式知识管理平台的核心载体&#xff0c;其架构设计围绕智能搜索引擎优化技术与多终端适配响应系统展开。通过模块化内容组件的灵活配置&#xff0c;企业可快速搭建知识库、FAQ页面及帮助中心等标准化场景&#xff0c;同时借助可视化数据看…

深度解析 Java 中介者模式:重构复杂交互场景的优雅方案

一、中介者模式的核心思想与设计哲学 在软件开发的历史长河中&#xff0c;对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时&#xff0c;系统会陷入 "牵一发而动全身" 的困境。中介者模式&#xff08;Mediator Pattern&#xff09;作为行…

untiy实现汽车漫游

实现效果 汽车漫游 1.创建汽车模型 导入汽车模型(FBX格式或其他3D格式),确保模型包含车轮、车身等部件。 为汽车添加碰撞体(如 Box Collider 或 Mesh Collider),避免穿透场景物体。 添加 Rigidbody 组件,启用重力并调整质量(Mass)以模拟物理效果。 2.编写汽车控制脚本…

PID项目---硬件设计

该项目是立创训练营项目&#xff0c;这些是我个人学习的记录&#xff0c;记得比较潦草 1.硬件-电路原理电赛-TI-基于MSPM0的简易PID项目_哔哩哔哩_bilibili 这个地方接地是静电的考量 这个保护二极管是为了在电源接反的时候保护电脑等设备 大电容的作用&#xff1a;当电机工作…

Pluto实验报告——基于FM的音频信号传输并解调恢复

目录 一、实验目的 ................................ ................................ ................................ .................. 3 二、实验内容 ................................ ................................ ................................ ......…

Leetcode 2792. 计算足够大的节点数

1.题目基本信息 1.1.题目描述 给定一棵二叉树的根节点 root 和一个整数 k 。如果一个节点满足以下条件&#xff0c;则称其为 足够大 &#xff1a; 它的子树中 至少 有 k 个节点。 它的值 大于 其子树中 至少 k 个节点的值。返回足够大的节点数。 如果 u v 或者 v 是 u 的…

使用ps为图片添加水印

打开图片 找到文字工具 输入想要添加的水印 使用移动工具移动到合适的位置 选中文字图层 设置不透明度 快捷键ctrlt可以旋转 另存为png格式图片

x64_ubuntu22.04.5安装:cuda driver + cuda toolkit

引言 本文操作均已实践验证&#xff0c;安装流程来自nvidia官方文档&#xff0c;验证平台显卡&#xff1a;RTX4070。 验证日期&#xff1a;2025.5.24. 1.安装cuda driver 1.1.安装方式有2种&#xff0c;这里选择方式1&#xff1a; 从apt安装最省事&#x1f496;&#xff0c…

开盘啦 APP 抓包 逆向分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 抓包 这是一个记录贴。 这个APP是数…

vs2022 Qt Visual Studio Tools插件设置

安装之后&#xff0c;需要指定QT中msvc编译器的位置&#xff0c;点击下图Location右边的按钮即可 选择msvc2022_64\bin目录下的 qmake.exe 另一个问题,双击UI文件不能打开设计界面 设置打开方式 选择msvc2022_64\bin目录下的designer.exe 确定即可 然后设置为默认值即可 确定…

Python包__init__.py标识文件解析

在 Python 中&#xff0c;__init__.py 文件是包&#xff08;Package&#xff09;的核心标识文件&#xff0c;它的存在使一个目录被 Python 解释器识别为「包」。这个文件有以下核心作用&#xff1a; 核心作用 标识包的存在 任何包含 __init__.py 的目录都会被 Python 视为一个包…

电商ERP管理系统,Java+Vue,含源码与文档,统筹订单、库存等,助力电商企业高效运营

前言&#xff1a; 在当今数字化飞速发展的电商时代&#xff0c;电商企业面临着日益激烈的市场竞争和复杂的业务运营环境。为了提升运营效率、降低成本、优化客户体验&#xff0c;一套高效、全面的电商ERP管理系统显得尤为重要。电商ERP管理系统整合了企业内部的各项业务流程&a…

Spring Boot微服务架构(四):微服务的划分原则

微服务划分原则&#xff08;CRM系统案例说明&#xff09; 一、微服务划分的核心原则 单一职责原则&#xff08;SRP&#xff09; 每个微服务只负责一个明确的业务功能服务边界清晰&#xff0c;避免功能混杂便于独立开发、测试和部署 业务领域驱动设计&#xff08;DDD&#xff0…

【打卡】树状数组的操作

#define MAXN 1000 int n; // 数组实际长度 int array[MAXN]; // 原始数组&#xff08;下标从0开始&#xff09; int tree[MAXN]; // 树状数组&#xff08;下标从1开始&#xff09; int p[MAXN]; // 前缀和数组&#xff08;下标从1…

HTTP协议初认识、速了解

目录 1. 什么是HTTP协议 2. HTTP协议特点 3. HTTP协议发展和版本 3.1. HTTP1.0 3.2. HTTP1.1 3.3. HTTP2.0 3.4. http1.1和http2.0区别 4. HTTP协议中URI、URL、URN 4.1. URI 4.2. URL 4.3. URN 5. HTTP协议的请求 5.1. HTTP协议中的请求信息 5. 总结 前言 本文讲…