FreeRTOS 队列结构体 xQUEUE 深度解析

一、核心成员与功能设计

FreeRTOS 的队列结构体 xQUEUE 是任务间通信(IPC)的核心数据结构,通过统一的设计支持队列、信号量、互斥量等多种同步机制。其设计体现了 ​**"数据拷贝 + 结构复用"** 的理念,兼顾轻量化与扩展性。

typedef struct QueueDefinition {int8_t *pcHead;           // 队列存储区起始地址 [1,4](@ref)int8_t *pcWriteTo;        // 下一个空闲写入位置 [4,5](@ref)union {                   // 类型复用联合体QueuePointers_t xQueue;     // 队列模式读写指针SemaphoreData_t xSemaphore; // 信号量模式数据结构} u;List_t xTasksWaitingToSend;      // 发送阻塞任务列表(按优先级排序)[3,5](@ref)List_t xTasksWaitingToReceive;   // 接收阻塞任务列表(按优先级排序)[3,5](@ref)volatile UBaseType_t uxMessagesWaiting; // 当前队列消息数量 [4,5](@ref)UBaseType_t uxLength;            // 队列容量(最大消息数)[1,4](@ref)UBaseType_t uxItemSize;          // 单个消息字节大小 [1,4](@ref)volatile int8_t cRxLock;         // 接收锁定计数器 [3,4](@ref)volatile int8_t cTxLock;         // 发送锁定计数器 [3,4](@ref)// ... 其他配置相关字段
} xQUEUE;

二、关键成员详解
1. ​存储管理机制
  • ​**pcHead 与 pcWriteTo**
    构成循环缓冲区的基础指针。pcHead 指向存储区物理起始地址,pcWriteTo 动态标记下一个写入位置,实现 FIFO 队列的线性地址映射 。

  • 数据拷贝策略
    采用 ​内存复制​(非引用传递)确保数据完整性,避免裸机全局变量共享导致的竞态风险(如中断与任务数据冲突)。例如温度监控场景中,温度数据被完整复制到队列,避免读写半值问题 。

2. ​任务阻塞管理
  • ​**xTasksWaitingToSend/Receive**
    双向链表结构管理阻塞任务,按优先级排序实现确定性唤醒。当队列满/空时,任务加入对应列表,触发调度器优先级判断 。

    示例:队列满时,高优先级发送任务会抢占低优先级任务资源 。
  • 阻塞超时机制
    支持 xTicksToWait 参数设置最大等待时间,超时后任务自动就绪并返回错误码(如 errQUEUE_FULL)。

3. ​类型复用设计
  • 联合体 u 的妙用
    • 队列模式QueuePointers_t 维护 pcReadFrom 指针,实现 FIFO/LIFO 双模式读取 。
    • 信号量模式SemaphoreData_t 记录持有者(xMutexHolder)和递归计数(uxRecursiveCallCount),支持优先级继承与递归锁 。
4. ​性能优化字段
  • ​**cRxLock/cTxLock**
    队列锁定期间统计操作次数,解锁后批量处理。例如中断中快速记录发送次数(cTxLock++),退出临界区后统一处理阻塞任务 。

  • ​**uxMessagesWaiting**
    原子变量记录实时消息数,实现 O(1) 复杂度的状态查询,避免遍历存储区 。


三、设计对比与特性总结
特性FreeRTOS xQUEUERT-Thread rt_semaphore
数据结构复用队列/信号量/互斥量共用同一结构体 

4

独立结构体设计
内存管理支持动态/静态分配(xQueueCreate/xQueueCreateStatic

4

5

主要静态分配
优先级策略优先级继承(仅互斥量模式)

4

优先级继承 + 天花板策略
实时性优化锁定计数器减少上下文切换 

3

4

中断延迟更低(专为硬实时优化)

四、典型应用场景
  1. 中断-任务通信
    使用 xQueueSendFromISR 在中断中传递数据,通过 pcWriteTo 快速写入,cTxLock 记录发送次数 。

  2. 资源互斥访问
    复用为互斥量时,SemaphoreData_t 字段实现递归锁,防止任务重复获取导致死锁 。

  3. 流量控制
    uxMessagesWaiting 监控队列负载,动态调整生产者速率(如网络协议栈流量控制)。

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

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

相关文章

斜对角线的应用

引入 题目描述 经典应用:八皇后问题 dg和udg数组的解释 对角线 d g [ u i ] d g [ u i ] dg[ui]dg[ui] dg[ui]dg[ui],反对角线 u d g [ n − u i ] u d g [ n − u i ] udg[n−ui]udg[n−ui] udg[n−ui]udg[n−ui]中的下标 u i ui ui和 n − …

简单聊聊Oracle和MySQL数据库的区别和使用场景

对于IT的技术人员,MySQL是非常熟悉的开源数据库,在各个行业被广泛应用。但是对于Oracle数据库,很多专业的IT从业人员不太了解,今天就来聊一聊Oracle和MySQL的一些区别。 1. 使用场景 首先MySQL是在各种IT公司或者非IT公司广泛应用…

STM32学习笔记之存储器映射(原理篇)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

mapbox V3 新特性,添加三维球鹰眼图控件

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️mapbox-gl-globe-minimap 三维球体鹰眼…

MySQL-调优策略-SQL语句

引言 架构调优,在系统设计时首先需要充分考虑业务的实际情况,是否可以把不适合数据库做的事情放到数据仓库、搜索引擎或者缓存中去做;然后考虑写的并发量有多大,是否需要采用分布式;最后考虑读的压力是否很大&#xf…

6502电气集中联锁道岔控制电路的工作过程

6502电气集中联锁道岔控制电路的工作过程主要包括选择进路、转换道岔、锁闭进路、开放信号和解锁进路等环节,以下是其具体工作过程模拟: 选择进路: 按压按钮:操作人员在控制台上按压进路两端的按钮,如始端按钮和终端按…

DS足球监控【比分直播】监控,钉钉实现自动提醒

文章目录 目标网站分析详细分析提醒工具代码截图成功提示对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学:https://blog.csdn.net/weixin_35770067/article/details/142514698 目标网站分析 https://live.dszuqiu.com/监控目标:实现固定时间内对比分监控,实现自动下单…

基于ssm的医院预约挂号系统

一、系统架构 前端:jsp | bootstrap | jquery | css | ajax 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. 首页 04. 医院挂号 05. …

华为OD机试A卷 - 快递业务站 计算快递主站点(C++ Java JavaScript Python )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 快递业务范围有 N 个站点,A 站点与 B 站点可以中转快递,则认为 A-B 站可达, 如果 A-B 可达,B-C 可达,则 A-C 可达。 现在给 N 个站点编号 0、1、…n-1,用 s[i][j]表示 i-j 是否可…

三维动态规划-LeetCode3418. 机器人可以获得的最大金币数

太爽了!做完这道题,让我感觉就像是斩杀了一条大龙!历时72天,分3次花掉30小时。终获突破! 零、题目 3418. 机器人可以获得的最大金币数 给你一个 m x n 的网格。一个机器人从网格的左上角 (0, 0) 出发,目…

相生、相克、乘侮、复杂病机及对应的脏腑功能联系

一、五行相生关系(母子关系) 五行生序脏腑关系生理表现举例木生火肝(木)滋养心(火)肝血充足则心血旺盛火生土心(火)温煦脾(土)心阳充足则脾胃运化功能正常土…

Ubuntu22.04搭建freeradius操作说明

Ubuntu22.04搭建freeradius操作说明 更新依赖库 sudo apt update sudo apt install build-essential sudo apt install libtalloc-dev sudo apt install libssl-dev 按照freeradius sudo apt install freeradius 修改freeradius配置 文件路径如下 /etc/freeradius/3.…

es中安装ik分词器

在线安装ik插件(较慢) docker exec -it es /bin/bash ./bin/es-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip 看到报错了,我访问一下。就是没有了…

最大字段和问题 C++(穷举、分治法、动态规划)

问题描述 给定由n个整数(包含负整数)组成的序列a1,a2,…,an,求该序列子段和的最大值。规定当所有整数均为负值时定义其最大子段和为0 穷举法 最简单的方法就是穷举法,用一个变量指示求和的开始位置,一个变量指示结束…

如何理解三极管截至区、放大区、饱和区

一、 三极管符号: NPN : PNP: 二、Vce、与Ic曲线图 1、截至区:ib很小的时候就是截至区。因为Ib很小的时候等价于Ub很小,Ub如果不足以达到0.7V PN结就不会导通,所以三极管就…

电脑上我的windows目录下,什么是可以删除的

在Windows系统目录(通常是C:\Windows)中,大部分文件和文件夹都是系统运行所必需的,随意删除可能导致系统崩溃或程序无法运行。不过,部分文件可以安全清理。以下是详细指南: 可安全清理的内容 临时文件&…

工作中遇到的spark SQL小问题:包含某个或某些字符的条件

今天又来总结工作中遇到的问题了,今天是SQL,spark引擎 需求描述,筛选渠道包含”线上化“的数据 也就是讨论where里面的这个筛选条件怎么写 一般起手都是 where QD like %线上化%‘ 学习了其他的写法: 1.INSTR函数 where INSTR(QD,&quo…

Git 命令操作完全指南

Git 是现代软件开发中不可或缺的分布式版本控制系统。它不仅能追踪代码变更,还能协调多人协作、管理项目历史。本文从核心概念入手,逐步深入讲解 Git 的基础与高级命令,结合实用场景,帮助您从入门到精通。 一、Git 核心概念 理解…

深入剖析带头循环双向链表的实现与应用

引言 场景描述 想象一个 环形地铁线路(如深圳地铁11号线),这条线路首尾相连,列车可以顺时针或逆时针循环行驶。为了方便管理,地铁系统设置了一个 “虚拟调度中心”(头节点),它不承…

DeepSeek Smallpond 在火山引擎 AI 数据湖的探索实践

资料来源:火山引擎-开发者社区 DeepSeek Smallpond 介绍 Smallpond 是一套由 DeepSeek 推出的 、针对 AI 领域,基于 Ray 和 DuckDB 实现的轻量级数据处理引擎,具有以下优点: 1.轻量级 2.高性能 3.支持规模大 4.无需运维 5.P…