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

FreeRTOS线程数据传递---消息队列

简介      

队列操作

创建队列

队列写入

队列写入

队列读取

队列相关函数

1.创建队列

2.向队列写入

3.从队列读取

队列的其他写入API函数


简介      

        在实际的项目开发中,经常会遇到在任务于任务之间或任务于中断之间需要进行“沟通交
流”,这里的“沟通交流”就是消息传递的过程。在不使用操作系统的情况下,函数与函数,或
函数与中断之间的“沟通交流”一般使用一个或多多个全局变量来完成,但是在操作系统中,
因为会涉及“资源管理”的问题,比方说读写冲突,因此使用全局变量在任务于任务或任务于
中断之间进行消息传递,并不是很好的解决方案。FreeRTOS 为此提供了“队列”的机制。

        基于队列,FreeRTOS 实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二
值信号量、递归互斥信号量,因此很有必要深入了解 FreeRTOS 的队列。

        在我最初使用任务之间信息的传递/同步的时候使用的都是一整个全局变量,或者一堆结构体,但是这样不仅会使得任务之间的调试变得困难,需要连续跳转多个文件,另一个很大的弊端是会很大程度增大不同任务之间的耦合度,使得单独测试某个模块变得困难。

        使用消息队列能够使系统更加健壮、灵活并且容易管理,消息队列也可以使得消息的顺序得以保留,并且在高峰期使得消息有足够的缓存空间。然而,引入消息队列也会增加系统的复杂性,因此在设计时需要权衡其带来的好处与额外的复杂性。

!需要注意的是:

如果任务因等待队列而阻塞的时间超过指定的
阻塞超时时间,那么任务也将自动被转移到就绪态任务列表中,但不再读取队列中的数据

队列操作

创建队列

队列写入

队列写入

队列读取

(摘自 正点原子 FreeRTOS 开发教程 》)

队列相关函数

1.创建队列

QueueHandle_t TestQueue1;//队列声明TestQueue1 = xQueueCreate(3, sizeof(uint8_t));//创建队列,创建的队列长度为3,每个节点大小为uint8_t的长度

2.向队列写入

uint8_t key=1;
xQueueSend(TestQueue1,&key,portMAX_DELAY); //向队列尾部写入1,队列写入等待时间为最长

3.从队列读取

uint8_t queue_recv;
xQueueReceive(TestQueue1, &queue_recv, portMAX_DELAY);//从队列中读取一个尾部值到queue_recv并且删除尾部的值

注意在队列读取的时候如果直到最大阻塞超时时间还是没有等到队列里有新元素的时候会直接返回

        这样只需要在不同任务中读取对应的队列即可,体现了面向对象设计七大原则中的“组合/聚合复用原则”使得不同任务之间的关系是组合而非继承,并且减少了程序之间的耦合,增强了程序的健壮性

队列的其他写入API函数

函数
描述
xQueueSend()
往队列的尾部写入消息
xQueueSendToBack()
xQueueSend()
xQueueSendToFront()
往队列的头部写入消息
xQueueOverwrite()
覆写队列消息(只用于队列长度为 1 的情况)
xQueueSendFromISR()
在中断中往队列的尾部写入消息
xQueueSendToBackFromISR()
xQueueSendFromISR()
xQueueSendToFrontFromISR()
在中断中往队列的头部写入消息
xQueueOverwriteFromISR()
在中断中覆写队列消息(只用于队列长度为 1 的情况)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Git如何安装和配置
  • 详解PASCAL VOC数据集及基于Python和PyTorch的下载、解析及可视化【目标检测+类别分割】
  • QT5.14.2编译有界面的DLL供C#Winform程序调用步骤
  • C#编程语言及.NET 平台快速入门指南
  • 高级java每日一道面试题-2024年9月02日-基础篇-什么是脏读、不可重复读和幻读?
  • 2020年ICPC南京站 补题记录
  • Kevin‘s notes about Qt---Episode 2 线程通信
  • 突破编程_C++_设计模式(组合模式)
  • C#知识|加强面向对象编程的认识
  • 2024年【氧化工艺】考试及氧化工艺最新解析
  • docker run的--shm-size是干嘛用的
  • 聊一下Jetpack AppStartUp的使用和原理。
  • ClimODE——使用神经网络ODE 进行天气预报
  • 日志管理与时钟同步
  • 11 Java 方法引用、异常处理、Java接口之函数式编程(接口知识补充Function<T,R>、BiFunction<T, U, R>和自定义泛型接口)
  • ComponentOne 2017 V2版本正式发布
  • const let
  • echarts的各种常用效果展示
  • javascript 哈希表
  • laravel with 查询列表限制条数
  • Otto开发初探——微服务依赖管理新利器
  • SQL 难点解决:记录的引用
  • STAR法则
  • vue的全局变量和全局拦截请求器
  • 从0实现一个tiny react(三)生命周期
  • 京东美团研发面经
  • 跳前端坑前,先看看这个!!
  • 微信公众号开发小记——5.python微信红包
  • 阿里云ACE认证学习知识点梳理
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (python)数据结构---字典
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (过滤器)Filter和(监听器)listener
  • (论文阅读40-45)图像描述1
  • (十六)Flask之蓝图
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (原創) 物件導向與老子思想 (OO)
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Sublime Text3配置Lua运行环境
  • (转)我也是一只IT小小鸟
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET企业级应用架构设计系列之结尾篇
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /etc/motd and /etc/issue
  • [04]Web前端进阶—JS伪数组
  • [ACP云计算]易混淆知识点(考题总结)
  • [ACP云计算]组件介绍