当前位置: 首页 > article >正文

Freertos——使用队列集优化数据传输

队列集通常在实际的产品设计中我们对硬件的原始数据队列和参与操作的软件数据队列应该是分开设计这样能保证我们的业务逻辑能更加清晰独立并且硬件读取逻辑可以再不同产品中复用会导致一个问题我们需要在每个硬件读取后进行相应的数据转化任务如果硬件过多会导致任务栈占据过多的内存且使任务切换过于频繁污染了时间片因此我们可以使用到队列集使得写入同一个业务的软件队列的原始数据队列转换达成统一使得任务数量减少并且更容易修改移植我们的代码业务逻辑红外遥控器驱动程序里它只应该把键值记录下来、写入某个队列它不应该把键值转换为游戏的控制键。在红外遥控器的驱动程序里不应该有游戏相关的代码这样切换使用场景时这个驱动程序还可以继续使用。把红外遥控器的按键转换为游戏的控制键应该在游戏的任务里实现。要支持多个输入设备时我们需要实现一个“InputTask”它读取各个设备的队列得到数据后再分别转换为游戏的控制键。队列集的本质也是队列只不过里面存放的是“队列句柄”。使用过程如下创建队列A它的长度是n1创建队列B它的长度是n2创建队列集S它的长度是“n1n2”把队列A、B加入队列集S这样写队列A的时候会顺便把队列A的句柄写入队列集S这样写队列B的时候会顺便把队列B的句柄写入队列集SInputTask先读取队列集S它的返回值是一个队列句柄这样就可以知道哪个队列有有数据了然后InputTask再读取这个队列句柄得到数据。内部机制每当在一个队列写入数据系统自动在这个队列在的队列集的队列中写入一个此队列句柄当队列集读取时就会依次返回出他的队列中存放的句柄然后再凭借返回的句柄操作对应的队列创建队列集QueueSetHandle_txQueueCreateSet(constUBaseType_t uxEventQueueLength)uxQueueLength队列集长度可存放的队列句柄数返回值非0成功返回句柄以后使用句柄来操作队列NULL失败因为内存不足加入队列BaseType_txQueueAddToSet(QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet);xQueueOrSemaphore队列句柄要放入的队列xQueueSet队列集句柄返回值pdTRUE成功pdFALSE失败读取非空队列QueueSetMemberHandle_txQueueSelectFromSet(QueueSetHandle_t xQueueSet,TickType_tconstxTicksToWait);xQueueSet队列集句柄xTicksToWait如果队列集空则无法读出数据可以让任务进入阻塞状态如果被设为0无法读出数据时函数会立刻返回如果被设为portMAX_DELAY则会一直阻塞直到有数据可写返回值NULL失败队列句柄成功从队列集移除成员BaseType_txQueueRemoveFromSet(QueueSetMemberHandle_t xQueueOrSemaphore,QueueSetHandle_t xQueueSet);xQueueOrSemaphore队列句柄要放入的队列xQueueSet队列集句柄返回值pdTRUE失败pdFALSE成功删除队列集voidvQueueDeleteSet(QueueSetHandle_t xQueueSet);xQueueSet队列集句柄注意需先移除所有成员否则可能导致内存泄漏简单程序示例// 1. 创建队列和队列集QueueHandle_t xKeyQueuexQueueCreate(5,sizeof(uint8_t));// 按键队列QueueHandle_t xUartQueuexQueueCreate(3,sizeof(char));// 串口队列QueueSetHandle_t xInputSetxQueueCreateSet(53);// 队列集// 2. 将队列加入队列集xQueueAddToSet(xKeyQueue,xInputSet);xQueueAddToSet(xUartQueue,xInputSet);// 3. 数据写入任务例如按键中断、串口中断voidvWriteTask(void*pvParameters){uint8_tkey0x01;xQueueSend(xKeyQueue,key,0);// 写入按键队列自动触发队列集}// 4. InputTask统一处理voidvInputTask(void*pvParameters){QueueSetMemberHandle_t xActivatedMember;uint8_tkeyData;charuartData;while(1){// 等待队列集有数据xActivatedMemberxQueueSelectFromSet(xInputSet,portMAX_DELAY);// 判断是哪个队列有数据if(xActivatedMemberxKeyQueue){xQueueReceive(xKeyQueue,keyData,0);// 处理按键数据如转换为游戏控制键}elseif(xActivatedMemberxUartQueue){xQueueReceive(xUartQueue,uartData,0);// 处理串口数据}}}注意事项队列集长度的设置队列集长度需 ≥ 所有成员队列的总长度或信号量的最大计数值之和。例如队列 A 长度为 5队列 B 长度为 3则队列集长度应 ≥ 8最坏情况下两个队列同时满队列集需存放 8 个句柄成员的 “独占性”队列 / 信号量加入队列集后不应再直接读写否则会导致队列集状态不同步。需通过队列集机制间接访问先xQueueSelectFromSet() 获取句柄再读写对应队列这个函数类似于xQueueReceive()的阻塞机制中断中使用队列集若在中断中操作队列集成员需使用中断安全的队列读取函数 xQueueSendFromISR()

相关文章:

Freertos——使用队列集优化数据传输

队列集 通常在实际的产品设计中,我们对硬件的原始数据队列和参与操作的软件数据队列应该是分开设计这样能保证我们的业务逻辑能更加清晰独立,并且硬件读取逻辑可以再不同产品中复用会导致一个问题,我们需要在每个硬件读取后进行相应的数据转…...

基于时序卷积与判别性字典学习的齿轮箱变工况故障诊断【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)时序空洞卷积金字塔与多尺度感受野:齿轮…...

别再只会apt了!在统信UOS/麒麟KOS上,用dpkg命令搞定微信、WPS等.deb包的安装与管理

国产系统进阶指南:dpkg命令在统信UOS/麒麟KOS中的高阶应用 当你在统信UOS或麒麟KOS上双击一个.deb文件却遭遇安装失败时,是否意识到这背后隐藏着一个更强大的工具世界?作为国产操作系统的深度用户,掌握dpkg命令不仅能解决90%的第三…...

零基础快速启用 OpenClaw,保姆级零代码部署教程

Windows 一键部署 OpenClaw 教程|5 分钟搞定本地 AI 智能体,告别复杂配置 点击下载最新 OpenClaw 安装包 2026 年开源圈备受关注的「数字员工」OpenClaw(昵称小龙虾),GitHub 星标突破 28 万 ,凭借本地运行…...

中文乱码 ubuntu autodl

问题:中文乱码 rootautodl-container-1139448516-8360e2c7:~# ls 0-$\346\250\241\345\236\213\344\270\213\350\275\275-27B-FP8.sh autodl-pub 0-$\346\250\241\345\236\213\344\270\213\350\275\275-27…...

新手开发者首次接入大模型API可能遇到的常见问题与排查思路

新手开发者首次接入大模型API可能遇到的常见问题与排查思路 1. 获取与配置API Key 在Taotoken平台创建API Key是接入的第一步。常见问题包括密钥未正确保存或配置错误。登录Taotoken控制台后,在「API密钥」页面点击「新建密钥」,系统会生成一串以sk-开…...

Java SFTP递归下载踩坑实录:Hutool 5.8.16版本下处理空文件夹和符号链接

Java SFTP递归下载实战:Hutool 5.8.16版本深度优化指南 当我们需要从远程服务器批量下载文件时,SFTP协议因其安全性和可靠性成为首选。然而在实际开发中,递归下载功能往往会遇到各种意料之外的问题。本文将带你深入Hutool 5.8.16版本的SFTP实…...

3Dmax建模避坑指南:用‘桥’和‘推拉’做圆孔,如何避免布线混乱和破面?

3Dmax建模避坑指南:用‘桥’和‘推拉’做圆孔,如何避免布线混乱和破面? 在3D建模的世界里,圆孔看似简单,却往往是新手进阶路上的绊脚石。特别是当使用"桥"工具和"推拉"法时,稍有不慎就…...

Radiology(IF=15.2)法国居里研究所等团队:治疗后MRI预测三阴性乳腺癌对新辅助化疗免疫治疗的病理完全缓解

01文献学习今天分享的文献是由法国居里研究所等团队于2025年7月在《Radiology》(中科院1区top,IF15.2)上发表的研究“Posttreatment MRI to Predict Pathologic Complete Response of Triple-Negative Breast Cancer to Neoadjuvant Chemoimm…...

DeepSeek V1 到 V4 完整技术路线:每一代到底解决了什么问题?

DeepSeek V1 到 V4 完整技术路线:每一代到底解决了什么问题? 这篇文章的目标,是用工程视角把 DeepSeek 的技术路线讲明白,而不是把一堆论文名和版本号按时间顺序重新复述一遍。 很多人第一次看到 DeepSeek,会有一种错觉…...

W55MH32 芯片 MicroPython 实战 (2):GPIO 通用输入输出

本文为 WIZnet W55MH32芯片 MicroPython 教程第 2 篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。 版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处。 前言 上一篇实战教程,我们已…...

Taotoken透明计费与详细账单如何帮助个人开发者控制预算

Taotoken透明计费与详细账单如何帮助个人开发者控制预算 1. 账单中心的核心数据维度 Taotoken平台的账单中心为开发者提供了多维度的消费数据展示。每笔API调用记录包含精确到秒的时间戳、调用的具体模型名称、实际消耗的Token数量以及根据当前费率计算出的费用。这些数据以原…...

改进SMOTE类不平衡故障诊断【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 如需沟通交流,扫描文章底部二维码。(1)基于多数类样本分布的改进SMOTE算法MSMOTE:针对传…...

Chapter 5:深度章 - AI 编程思维转变

Chapter 5:深度章 - AI 编程思维转变 学习目标 理解从传统开发到 AI Engineering 的角色重塑 掌握 SDD(规格驱动开发)的核心理念 理解从"写代码"到"设计系统"的思维转变 能够用新思维指导日常工作 一、工程师角色的重塑 1.1 传统开发中的工程师角色 …...

桌面美化与效率结合,这款免费桌面工具能管理倒计时、宠物和加密

目录 软件介绍 总结 今天想和大家分享一款我近期在用的桌面小工具,叫“滴哦小精灵”。它是一个免费的桌面工具箱,集成了不少实用功能,界面比较干净,也没有什么广告,用起来挺省心的。 软件介绍 对我个人来说&#xf…...

Laravel 12原生AI扩展实战:5步实现智能表单验证、动态内容生成与实时代码补全

更多请点击: https://intelliparadigm.com 第一章:Laravel 12原生AI扩展的核心架构与设计哲学 Laravel 12 将 AI 集成从插件式实践升级为框架级原生能力,其核心架构围绕「可插拔智能层(Pluggable Intelligence Layer, PIL&#x…...

别再让维表Join拖慢你的Flink任务!手把手教你用Redis Connector实现高性能Lookup Join

突破Flink维表Join性能瓶颈:Redis Connector深度优化实战 当数据流速达到每秒数万条时,传统的维表Join操作往往成为整个Flink任务的性能瓶颈。本文将揭示如何通过Redis Connector的高级配置和优化技巧,将Lookup Join的吞吐量提升10倍以上。 1…...

从开发测试到等保三级认证:Dify细粒度权限管控全生命周期实施路线图(含策略模板+OpenPolicyAgent集成脚本)

更多请点击: https://intelliparadigm.com 第一章:Dify细粒度权限管控的架构演进与合规价值 Dify 作为开源 LLM 应用开发平台,其权限模型经历了从 RBAC(基于角色的访问控制)到 ABAC(基于属性的访问控制&am…...

BEV感知避坑指南:基于LSS系列方法的工程实践与调参经验分享

BEV感知实战避坑指南:LSS系列方法工程调优全解析 当算法工程师第一次将BEV感知模型部署到实车环境时,往往会遇到这样的场景:实验室指标优秀的模型在实际道路上突然出现深度估计跳变、BEV特征空间扭曲、多传感器特征错位等问题。这些问题轻则导…...

LLM在文本分析与差异检测中的实践应用

1. 项目背景与核心价值去年在帮某金融客户做用户反馈分析时,我遇到了一个典型难题:面对每天数千条非结构化的投诉文本,传统规则引擎的准确率还不到60%。直到尝试将大语言模型(LLM)引入分析流程,效果才出现质…...

3分钟掌握完整网页截图:告别零碎片段,拥抱完整内容保存

3分钟掌握完整网页截图:告别零碎片段,拥抱完整内容保存 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-…...

从ChatGPT到SEEM:聊聊下一代AI交互界面如何用‘记忆提示’记住你的每一次点击

从ChatGPT到SEEM:下一代AI交互界面如何用‘记忆提示’重塑用户体验 当你在Photoshop中反复调整同一张图片的选区时,是否想过AI可以像人类助手一样记住你的操作习惯?这正是SEEM(Segment Everything Everywhere All at Once&#x…...

Visual Studio调试时遇到ntdll.dll的PDB文件缺失?别慌,这3个方法帮你搞定(附详细步骤)

Visual Studio调试时ntdll.dll的PDB文件缺失问题深度解决方案 1. 问题现象与本质剖析 当你正在Visual Studio中全神贯注地调试一个C项目时,突然在输出窗口看到这样的警告信息:"已加载C:\Windows\SysWOW64\ntdll.dll。无法查找或打开PDB文件"。…...

传承与奉献:资深技术人如何做好“传帮带”?

传承与奉献:资深技术人如何做好“传帮带”在软件测试行业,技术的迭代速度如同奔涌的江河,新工具、新框架、新方法论层出不穷。而支撑行业持续向前的,除了前沿技术的突破,更离不开资深技术人对经验的传承与奉献。“传帮…...

FOSDEM 2023:开源嵌入式与物联网技术前沿解析

1. FOSDEM 2023:开源嵌入式与物联网技术盛宴回归线下作为欧洲最大的开源开发者盛会,FOSDEM(Free and Open Source Developers European Meeting)在经历两年线上举办后,终于在今年2月4-5日重返比利时布鲁塞尔。这场完全…...

ShipPage-Skill:基于Vite+React的静态站点生成器,快速打造个人技能展示页

1. 项目概述:一个面向开发者的技能展示与项目聚合页最近在GitHub上看到一个挺有意思的项目,叫“ShipPage-Skill”。光看名字,你可能会有点摸不着头脑,这到底是做什么的?简单来说,这是一个帮你快速搭建个人技…...

FPGA安全NTT架构设计与防护机制解析

1. FPGA安全NTT架构设计背景与挑战数论变换(Number Theoretic Transform, NTT)作为现代格密码(如Kyber、Dilithium等)的核心运算模块,其硬件实现面临着日益严峻的安全威胁。在FPGA平台上,NTT模块不仅需要保…...

taotoken 多模型聚合能力如何赋能智能客服场景开发

Taotoken 多模型聚合能力在智能客服场景的开发实践 1. 智能客服场景的模型需求特点 智能客服系统需要处理多样化的用户咨询场景,从简单的FAQ问答到复杂的业务逻辑解析。不同场景对语言模型的要求存在显著差异。例如产品参数查询需要精确的事实检索能力&#xff0c…...

Windows下PyGMT安装报错‘GMTCLibNotFoundError’?手把手教你从零配置GMT 6.3.0环境

Windows系统PyGMT环境配置全攻略:从报错排查到完美运行 最近在帮一位地质学专业的朋友处理数据可视化问题时,遇到了PyGMT安装的各种"坑"。作为Python科学计算的老手,本以为装个库不过是pip install的事,没想到在Window…...

Legacy-iOS-Kit终极指南:如何免费让旧iPhone和iPad重获新生

Legacy-iOS-Kit终极指南:如何免费让旧iPhone和iPad重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...