30-消息队列
一、消息队列概述
队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、 中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消息是空时,读取消息的任务将被阻塞,用户还可以指定阻塞的任务时间 xTicksToWait,在这段时间中,如果队列为空,该任务将保持阻塞状态以等待队列数据有效。
当队列中有新消息时,被阻塞的任务会被唤醒并处理新消息;当等待的时间超过了指定的阻塞时间,即使队列中尚无有效数据,任务也会自动从阻塞态转为就绪态。
消息队列是一种异步的通信方式。通过消息队列服务,任务或中断服务例程可以将一条或多条消息放入消息队列中。同样,一个或多个任务可以从消息队列中获得消息。当有多个消息发送到消息队列时,通常是将先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入消息队列的 消息,即先进先出原则(FIFO),但是也支持后进先出原则(LIFO)。
- 消息支持先进先出方式排队,支持异步读写工作方式。
- 读写队列均支持超时机制。
- 消息支持后进先出方式排队,往队首发送消息(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
相关文章:

30-消息队列
一、消息队列概述 队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、 中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的…...
跨域解决方案之JSONP
目录 一、JSONP 核心原理 二、JSONP 实现步骤 (一)客户端代码 (二)服务器端代码(ASP.NET实现) 1. ASP.NET Web Forms 实现 2. ASP.NET Core 实现 三、JSONP 优缺点 (一)优点 …...
【AI测试革命】第七期:AI性能测试的深度实践——从智能建模到自动化调优的全链路升级
在微服务架构与高并发场景普及的当下,性能测试作为保障系统稳定性和用户体验的核心环节,正面临负载模型构建复杂、脚本维护成本高、瓶颈定位效率低等挑战。Copilot凭借代码生成、数据分析和智能决策能力,为性能测试全流程注入新动能ÿ…...

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设计之带分页的穿梭框原型
穿梭框(Transfer)是一种常见且实用的交互组件,广泛应用于需要批量选择或分配数据的场景。 一、应用场景 其典型应用场景包括: 权限管理系统:批量分配用户角色或系统权限数据筛选工具:在大数据集中选择特…...
嵌入式硬件篇---陀螺仪|PID
文章目录 前言1. 硬件准备主控芯片陀螺仪模块电机驱动电源其他2. 硬件连接3. 软件实现步骤(1) MPU6050初始化与数据读取(2) 姿态解算(互补滤波或DMP)(3) PID控制器设计(4) 麦克纳姆轮协同控制4. 主程序逻辑5. 关键优化与调试技巧(1) 传感器校准(2) PID参数整定先调P再调D最后…...

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

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

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

深度解析 Java 中介者模式:重构复杂交互场景的优雅方案
一、中介者模式的核心思想与设计哲学 在软件开发的历史长河中,对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时,系统会陷入 "牵一发而动全身" 的困境。中介者模式(Mediator Pattern)作为行…...
家用和类似用途电器的安全 第1部分:通用要求 与2005版差异(7)
文未有本标准免费下载链接。 ——增加了“对峰值电压大于15kV的,其放电电能应不超过350mJ”的要求(见8.1.4) 1. GB/T4706.1-2024: 8.1.4 如果易触及部件为下述情况,则不认为其是带电的。 ——该部件由安全特低电压供电,且: 对…...
HTTP Digest 认证:原理剖析与服务端实现详解
HTTP Digest 认证:原理剖析与服务端实现详解 HTTP 协议中的 Digest 认证(摘要认证)是一种比 Basic 认证更安全的身份验证机制,其核心设计是避免密码明文传输,并通过动态随机数(Nonce)防范重放攻…...

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

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

Pluto实验报告——基于FM的音频信号传输并解调恢复
目录 一、实验目的 ................................ ................................ ................................ .................. 3 二、实验内容 ................................ ................................ ................................ ......…...
【Redis】AOF日志
目录 1、背景2、工作原理3、核心配置参数4、优缺点5、AOF文件内容 1、背景 AOF(Append Only File)是redis提供的持久化机制之一,它通过记录所有修改数据库状态的写命令来实现数据库持久化。与RDB(快照)方式不同&#…...

Leetcode 2792. 计算足够大的节点数
1.题目基本信息 1.1.题目描述 给定一棵二叉树的根节点 root 和一个整数 k 。如果一个节点满足以下条件,则称其为 足够大 : 它的子树中 至少 有 k 个节点。 它的值 大于 其子树中 至少 k 个节点的值。返回足够大的节点数。 如果 u v 或者 v 是 u 的…...
《关于浔川社团退出DevPress社区及内容撤回的声明》
《关于浔川社团退出DevPress社区及内容撤回的声明》 尊敬的DevPress社区及读者: 经浔川社团内部决议,我社决定自**2025年5月26日**起正式退出DevPress社区,并撤回所有由我社成员在该平台发布的原创文章。相关事项声明如下: …...
Windows逆向工程提升之IMAGE_RESOURCE_DIRECTORY
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 资源目录概述 什么是资源目录? 资源目录的作用 资源目录的位置 资源目录核心结构 IMAGE_RESOURCE_DIRECTORY IMAGE_RESOURCE_DIRECTORY_ENTRY IMAGE_RESOURCE_DATA_EN…...

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

x64_ubuntu22.04.5安装:cuda driver + cuda toolkit
引言 本文操作均已实践验证,安装流程来自nvidia官方文档,验证平台显卡:RTX4070。 验证日期:2025.5.24. 1.安装cuda driver 1.1.安装方式有2种,这里选择方式1: 从apt安装最省事💖,…...

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

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

Python包__init__.py标识文件解析
在 Python 中,__init__.py 文件是包(Package)的核心标识文件,它的存在使一个目录被 Python 解释器识别为「包」。这个文件有以下核心作用: 核心作用 标识包的存在 任何包含 __init__.py 的目录都会被 Python 视为一个包…...
【MySQL】第8节|Innodb底层原理与Mysql日志机制深入剖析(一)
MySQL 的 redo log(重做日志) redo log 是 MySQL 中 InnoDB 存储引擎实现事务持久性的关键机制,用于记录数据库数据的变更,确保事务提交后数据不丢失,即使发生宕机也能通过日志恢复数据。 核心作用 1. 实现事务的持…...

电商ERP管理系统,Java+Vue,含源码与文档,统筹订单、库存等,助力电商企业高效运营
前言: 在当今数字化飞速发展的电商时代,电商企业面临着日益激烈的市场竞争和复杂的业务运营环境。为了提升运营效率、降低成本、优化客户体验,一套高效、全面的电商ERP管理系统显得尤为重要。电商ERP管理系统整合了企业内部的各项业务流程&a…...

Spring Boot微服务架构(四):微服务的划分原则
微服务划分原则(CRM系统案例说明) 一、微服务划分的核心原则 单一职责原则(SRP) 每个微服务只负责一个明确的业务功能服务边界清晰,避免功能混杂便于独立开发、测试和部署 业务领域驱动设计(DDD࿰…...

【打卡】树状数组的操作
#define MAXN 1000 int n; // 数组实际长度 int array[MAXN]; // 原始数组(下标从0开始) int tree[MAXN]; // 树状数组(下标从1开始) int p[MAXN]; // 前缀和数组(下标从1…...
OpenLayers 加载动画控件
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图控件是一些用来与地图进行简单交互的工具,地图库预先封装好,可以供开发者直接使用。OpenLayers具有大部分常用的控件&#x…...