FreeRTOS消息队列

news/2025/2/24 20:32:31/文章来源:https://www.cnblogs.com/aicy-x/p/18733030

消息队列介绍

消息队列可以看作是一个先进先出(FIFO)的数据缓冲区,用于存储和传递消息。消息可以是任意类型的数据,如整数、结构体等。发送者将消息放入队列的尾部,接收者从队列的头部取出消息。这种方式保证了消息的顺序性,即先发送的消息会先被接收。

为什么不使用全局变量

多个任务可能同时访问和修改全局变量,这会导致数据竞争问题。例如,一个任务正在读取全局变量的值,而另一个任务同时在修改这个值,就可能会读取到不一致的数据。
为了保证全局变量的安全访问,需要使用互斥锁等同步机制。但如果使用不当,容易出现死锁等问题,增加了编程的复杂度。

消息队列的使用

创建队列

动态创建

函数原型

QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,UBaseType_t uxItemSize);

关键词

xQueueCreate

点击查看参数解析
UBaseType_t uxQueueLength:设置消息队列长度;
UBaseType_t uxItemSize:设置消息队列中单个消息的大小;

静态创建

函数原型

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

关键词

xQueueCreateStatic

点击查看参数解析
UBaseType_t uxQueueLength:设置消息队列长度;
UBaseType_t uxItemSize:设置单个消息大小;
uint8_t *pucQueueStorage:传递单个消息的存储结构;
StaticQueue_t *pxQueueBuffer:传递自定义的消息队列;

队列复位

函数原型

BaseType_t xQueueReset(QueueHandle_t pxQueue);

关键词

xQueueReset
将队列恢复为初始状态。

点击查看参数解析
QueueHandle_t pxQueue:队列句柄

删除队列

函数原型

void vQueueDelete( QueueHandle_t xQueue );

关键词

vQueueDelete
只能删除使用动态方法创建的队列,会释放内存。

点击查看参数解析
QueueHandle_t xQueue:队列句柄

写队列

队尾写入

函数原型

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

关键词

xQueueSend
xQueueSendToBack
队满会无法写入,一般使用第一个

点击查看参数解析
QueueHandle_t xQueue:队列句柄;
const void * pvItemToQueue:需要发送到消息队列中的数据;注意为指针
TickType_t xTicksToWait:设置阻塞超时时间,单位为tick。设置成0,可直接返回;设置成portMAX_DELAY,会一直阻塞,直到成功写入数据。

队头写入

函数原型

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

关键词

xQueueSendToFront

点击查看参数解析
QueueHandle_t xQueue:队列句柄;
const void * pvItemToQueue:需要发送到消息队列中的数据;注意为指针
TickType_t xTicksToWait:设置阻塞超时时间,单位为tick。设置成0,可直接返回;设置成portMAX_DELAY,会一直阻塞,直到成功写入数据。

中断写入

函数原型

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

关键词

xQueueSendFromISR
在中断服务程序里将数据发送到消息队列的操作。

点击查看参数解析
QueueHandle_t xQueue:传递消息队列的控制权柄;
const void *pvItemToQueue:传递需要发送的消息;注意为指针
BaseType_t *pxHigherPriorityTaskWoken:若消息入队列时产生一个更高优先级的任务,那么改参数就会被设置成pdTRUE,系统在中断函数结束前会切换任务,去执行更高优先级的任务。(可选)

覆盖队列

函数原型

BaseType_t xQueueOverwrite( QueueHandle_t xQueue, const void *pvItemToQueue, );

关键词

xQueueOverwrite

点击查看参数解析
QueueHandle_t xQueue:传递消息队列的控制权柄;
const void *pvItemToQueue:传递需要发送的消息;注意为指针
只有队列长度为1时才可使用。

读队列

普通读取

函数原型

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

关键词

xQueueReceive
从队头读取,会删除队列中被读取的元素。成功读取会返回pdTRUE,否则返回pdFALSE

点击查看参数解析
QueueHandle_t xQueue:队列权柄;
void * const pvBuffer:指向存储消息队列数据的存储空间;注意为指针
TickType_t xTicksToWait:消息队列接收函数的最大阻塞时间。设置成0,可直接返回;设置成portMAX_DELAY,会一直阻塞,直到成功读取数据。

中断读取

函数原型

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

关键词

xQueueReceiveFromISR
在中断服务程序里读取消息队列的操作。

点击查看参数解析
QueueHandle_t xQueue:队列权柄;
void * const pvBuffer:指向存储消息队列数据的存储空间;注意为指针
BaseType_t * const pxHigherPriorityTaskWoken:任务在往队列发送信息时,如果队列满,则任务将阻塞在该队列上,
若xQueueReceiveFromISR()函数碰到一个任务,则*pxHigherPriorityTaskWoken=pdTRUE;否则,其值为NULL。

窥探队列

函数原型

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

关键词

xQueuePeek

点击查看参数解析
QueueHandle_t xQueue:队列权柄;
void * const pvBuffer:指向存储消息队列数据的存储空间;注意为指针
TickType_t xTicksToWait:消息队列窥探函数的最大阻塞时间。设置成0,可直接返回;设置成portMAX_DELAY,会一直阻塞,直到成功窥探数据。
读取的特殊情况,只访问队列中数据,不删除。

其余函数

查询队列

查询可用数据个数

UBaseType_t uxQueueMessagesWaiting(const QueueHandle_t xQueue);

查询可用空间个数

UBaseType_t uxQueueSpaceAvailable(const QueueHandle_t xQueue);

中断

关键词+FromISR

可用

写队列(队尾、队头、覆盖)、读队列(普通、窥探)。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PNG图片宽高隐写

https://www.cnblogs.com/senior-engineer/p/9548347.html

[tldr] vscode的remote插件的config文件内容解析

参考VS Code Remote SSH配置 解决了什么问题 vscode的remote插件可以直接通过可视化的UI新建一个连接通过ssh指令添加服务器的连接方式但是这种方式添加的服务器名字等于服务器IP地址,难以理解 如果出现同一个IP地址,使用不同端口的SSH,那么会被视作同一个服务器,因为连接名字和…

使用Go复刻skiplist核心功能

0、引言 正好做LC每日一题要求实现一个跳表,于是学习了redis的扩展skiplist,并使用Go进行复刻学习。学习参考了文章:Redis内部数据结构详解(6)——skiplist - 铁蕾的个人博客 因为作者能力有限,本文只是对跳表的核心功能:创建节点与跳表、插入节点、删除节点、获取节点ran…

BUUCTF-RE-[ACTF新生赛2020]usualCrypt

又他妈的是新生赛,我都不是新生了还天天被折磨。 首先查壳分析,然后反编译程序,可以看到程序逻辑还是比较简单的我们进行一下整理和重命名,可以得到完整的程序逻辑: int __cdecl main(int argc, const char **argv, const char **envp) {int v3; // esichar v5[15]; // [e…

探秘Transformer系列之(6)--- token

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(6)--- token 0x00 概述 语言是人类特有的概念。作为一个抽象符号,…

leetcode hot 10

解题思路:滑动窗口问题,关键在于记录之前出现过的字符,当遍历过程中碰到之前出现的,就从之前出现的下一个作为start,实时比较当前值和最长值并赋值,最后返回最长值。java可以采用hashmap记录出现过的字符,value保存它的位置+1的值,作为出现重复的字符的时候的start的参考…

摆脱 Deepseek 服务器繁忙,手把手教你接入火山引擎 API(超详细版)

大家好,我是亿舟。大家最近应该都被 Deepseek 刷屏了,不少人想去试试 Deepseek 有多厉害,但是去到官网,没问几个问题,就弹出来“服务器繁忙,稍后再试”。今天教给大家一个方法,可以在 Cherry Studio 配合上火山引擎的 API,享受满血版、联网搜索、思考不截断的 Deepseek…

【Azure Developer】编写Python SDK代码实现从China Azure中VM Disk中创建磁盘快照Snapshot

问题描述 需要为中国区微软云(China Azure)中的虚拟机磁盘(VM Disk)创建快照, 官方文档中只有az cli(az snapshot create)脚本,并没有介绍使用Python SDK的办法,需要编写代码来实现快照的创建。问题解答 Azure Python SDK 的 Snapshot Class文档提供了参数说明,如 location…

AutoEval

目前文章的共性通过探究 其他方法(多任务学习器)得到的分类器与带原始标签的合成数据集分类器 的相关关系。得出一个可以应用在无标签且含有分布偏移的真实世界数据上,分类效果较好的分类器。【Frechet distance(Auto-eval),Rotation Prediction(Weijian Deng, Stephen …

开学测验——仓库管理系统

以下是项目结构:登录界面:输入不同用户名进入不同角色的主页面管理员:仓库工作人员:

【窃贼】- 2025.2.24

下图为《Balatro》中的一张小丑牌:【窃贼】窃贼是小丑牌中一张独一无二的小丑,其效果为 \(+3\) 出牌次数并失去所有弃牌次数。其能力相当强大,因为 \(+3\) 出牌次数涵盖了非常多的方面。首先 \(+3\) 出牌次数显然可以拉高分数,提升幅度在绝大多数情况下至少带来 \(\times 1…