FreeRTOS学习第9篇--队列介绍

目录

  • FreeRTOS学习第9篇--队列介绍
      • 1. 数据传输的方法
        • 1.1 任务之间如何传输数据
        • 1.2 队列的本质
      • 2. 队列的工作原理和实现
        • 2.1 创建队列
        • 2.2 向队列发送数据
        • 2.3 从队列接收数据
      • 3. 使用队列进行任务间的通信
        • 3.1 通信示例
        • 3.2 同步示例
      • 结论

FreeRTOS学习第9篇–队列介绍

本文目标:FreeRTOS学习第9篇–队列介绍

按照本文的描述,理解操作系统中的队列

本文实验条件:理论学习篇

1. 数据传输的方法

1.1 任务之间如何传输数据

多种方法比较:

数据个数互斥措施阻塞-唤醒使用场景
全局变量1一读一写
环形缓冲区多个一读一写
队列多个多读多写

初学感觉消息队列挺麻烦,搞个全局数组不是更简单,其实不然。在裸机编程时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。相比消息队列,使用全局数组主要有如下四个问题:

1.使用消息队列可以让 RTOS 内核有效地管理任务,而全局数组是无法做到的,任务的超时等机制需要用户自己去实现。

2.使用了全局数组就要防止多任务的访问冲突,而使用消息队列则处理好了这个问题,用户无需担心。

3.使用消息队列可以有效地解决中断服务程序与任务之间消息传递的问题。

4.FIFO 机制更有利于数据的处理。

1.2 队列的本质

队列中,数据的读写本质就是环形缓冲区,在这个基础上增加了互斥措施、阻塞-唤醒机制。

如果这个队列不传输数据,只调整"数据个数",它就是信号量(semaphore)。

如果信号量中,限定"数据个数"最大值为1,它就是互斥量(mutex)。

接下来,我们将继续深入探讨队列的工作原理、实现方式以及如何在FreeRTOS中使用队列进行任务间的同步和通信。

2. 队列的工作原理和实现

队列(Queue)是一种先进先出(FIFO,First In First Out)的数据结构,它允许在一端(rear)添加数据,在另一端(front)移除数据。在FreeRTOS中,队列不仅用于数据传输,还可以用作任务同步机制。FreeRTOS队列传递的是实际数据,并不是数据地址。

2.1 创建队列

在FreeRTOS中,队列是通过调用xQueueCreate()函数创建的。此函数需要两个参数:队列可以存储的最大元素数量和每个元素的大小。

c复制QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );

创建成功后,函数返回一个队列句柄(QueueHandle_t),通过这个句柄可以访问队列。如果创建失败,返回NULL

2.2 向队列发送数据

通过xQueueSend()xQueueSendToFront()xQueueSendToBack()xQueueSendOverwrite()函数可以向队列发送数据。这些函数允许在不同的场景下发送数据,比如添加到队列的前面或后面,或者覆盖队列中的现有数据。

BaseType_t xQueueSend( QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait );
2.3 从队列接收数据

通过xQueueReceive()函数从队列接收数据。调用此函数时,如果队列为空,则任务可以选择阻塞等待直到数据可用。

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

3. 使用队列进行任务间的通信

队列是实现任务间通信的强大工具。它们允许任务以线程安全的方式交换信息,而不必担心数据损坏或竞态条件。

3.1 通信示例

考虑一个生产者-消费者场景,生产者任务创建数据,消费者任务处理数据。这里,队列充当生产者和消费者之间的桥梁。

  1. 生产者任务将数据发送到队列。
  2. 消费者任务等待队列中的数据,接收后进行处理。
3.2 同步示例

队列也可以用于任务同步。例如,一个任务可能需要等待另一个任务完成特定工作后才能继续。这可以通过发送和接收特定的同步消息(或信号)来实现。

结论

理解和使用队列是掌握FreeRTOS中任务间通信和同步的关键。通过本文的介绍,您应该能够理解队列的基本概念、如何创建和使用队列以及如何利用队列在任务间传递数据和信号。实践中,灵活运用队列不仅可以解决复杂的同步问题,还能提升系统的稳定性和响应速度。

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

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

相关文章

《C++游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune

《C游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune 1.1.1 使用C编写游戏1.1.2 生成可执行文件1.1.3 错误处理 1.2 第一个C程序01.game_over.cpp01.game_over2.cpp01.game_over3.cpp 1.4 使用算术运算符01.expensive_calculator.cpp 1.5 声明和初始化变量01.game_stats…

minimap2参数设置+解释【全网最详细】

Indexing -H: 使用同源聚合的k-mer(适用于PacBio数据) -k INT: k-mer的大小(不超过28)【默认值:15】 -W INT: minimizer窗口大小【默认值:10】 -I NUM: 每个~NUM输入碱基分割索引【默认值:4G】 -d FILE: 将索引转储到文件中 Mapping: -f FLOAT: 过滤掉顶部FLOAT比例的重…

【设计模式】概述及七大设计原则

设计模式 什么是设计模式 设计模式是前辈们对代码开发经验的总结,是解决一些特定问题的一系列套路。不是语法规定,也是一套用来提高代码复用性、可维护性、可读性、健壮性和安全性的解决方案。 学习设计模式的意义 设计模式的本质是面向对象设计原则…

QML | 在QML中导入JavaScript资源、导入JavaScript资源、包含一个JavaScript 资源

01 在QML中导入JavaScript资源 JavaScript资源可以被QML文档和其他JavaScript通过相对或者绝对路径进行导入。如果使用相对路径,位置解析需要相对于包含import语句的QML文档或JavaScript资源的位置。如果JavaScript需要从网络资源中进行获取,组件的status属性会被设置为Loadi…

PyCM:Python中的混淆矩阵库

PyCM:Python中的混淆矩阵库 在机器学习和数据科学领域,评估模型的性能是至关重要的。混淆矩阵是一种常用的评估工具,用于可视化和量化分类模型的预测结果。PyCM是一个开源的Python库,提供了丰富的功能来计算和分析混淆矩阵。本文将…

【C++】STL(二) string容器

一、string基本概念 1、本质 string是C风格的字符串,而string本质上是一个类 string和char * 区别: char * 是一个指针 string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。 2、特点 1、stri…

R语言绘制桑基图教程

原文链接:R语言绘制桑基图教程 写在前面 在昨天3月10日,我们在知乎、B站等分享了功能富集桑基气泡图的绘制教程。相关链接:NC|高颜值功能富集桑基气泡图,桑基气泡组合图。 确实,目前这个图在文章中出现的频率相对比较…

【SQL实用技巧】-- 连续N天登陆问题

连续N天登录问题 以下为用户登陆日期,用一条 SQL 语句查询出连续三天登录的人员姓名。 nameddate张三2021-01-01张三2021-01-02张三2021-01-03张三2021-01-02李四2021-01-01李四2021-01-02王五2021-01-03王五2021-01-02王五2021-01-02 数据准备 create table ga…

Wilson威尔逊平滑

1、威尔逊平滑引入的动机 在曝光很少的情况下,计算出的CTR并不真实可靠,而样本数越大,CTR的比例才越准确,更能反应真实情况。 为了衡量样本数对于CTR信区间的影响,我们引入"威尔逊(Wilson&#xff0…

地球系统模式(CESM)

目前通用地球系统模式(Community Earth System Model,CESM)在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来,一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

STM32CubeMX 配置 STM32F103 工程:通过DAC输出正弦波

说明:STM32CubeMX 配置 STM32F103 工程,通过DAC输出正弦波,参考代码可自动计算频率,自动计算正弦数据。 先参考这篇文章配置时钟、工程输出的设置: STM32CubeMX 配置 STM32F103 工程:通过DAC生成三角波、…

【其他】清风眼中的《妙手仁心》

我是清风,一个以医生为正职,平时喜欢写点文字的男人。人家喜欢把我称为作家,可是我觉得我还配不上这个称呼。因为我所记录的只是一些身边的人和事,所抒发的也只是一些个人的情感,这与“作家”二字相去甚远。有人也许会…

【Go】探索Go语言中的关于defer的应用

冬来的秋去 像记忆裂痕 又再变更空枕触遗憾 半梦半醒侵沾眼晴的泪痕 每晚夜深妄想真情接近 绻梦绻恋一宵雨侵悲不禁 永远最相衬 但愿梦里是永恒 ——《永远之后-黄艺明》 在Go语言中,defer语句是一个非常强大且常用的特性,它允许我们在函数结束时执行一些…

【输入】NTC热敏电阻B值计算程序

两个主要的步骤: 设计分压器电路来测量NTC(负温度系数热敏电阻)的阻值。编写C语言函数来使用测量的阻值和NTC参数计算温度。 首先,让我们设计分压器电路。 分压器电路设计 您需要一个已知阻值的参考电阻,通常推荐与…

关于遗传力常见的误解

大家好,我是邓飞,今天看了一篇非常好的文章,介绍了遗传力相关概念和计算方法,里面提到了常见的误解,这里汇总一下。 文献链接:https://excellenceinbreeding.org/sites/default/files/manual/EiB-M2_Herit…

STM32CubeMX学习笔记20——SD卡FATFS文件系统

1. FATFS文件系统简介 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构(即在存储设备上组织文件的方法)。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统;不带文件系统的SD卡仅能…

C++初阶:类和对象(四)运算符重载与日期类Date的实现

在本节&#xff0c;我将通过实现日期类Date的实现来进一步阐释运算符重载的内容。 目录 一、Date.h 二、Date.cpp 三、test.cpp 一、Date.h #include<iostream> #include<cassert> using namespace std; class Date { public:// 获取某年某月的天数// 其为内联…

seo js转码工具

js转码工具作用 用于把js加密 如果不想让别人看到自己的js 代码就可以使用这个方法 js工具网址 https://tool.chinaz.com/js.aspx 效果

【大厂AI课学习笔记NO.74】人工智能产业技术架构

包括基础层、技术层和应用层。 人工智能的产业技术架构是一个多层次、多维度的复杂系统&#xff0c;它涵盖了从基础硬件和软件设施到高级算法和应用技术的全过程。这个架构通常可以分为三个主要层次&#xff1a;基础层、技术层和应用层。下面我将详细论述这三个层次及其细分内…

基于Yolo5模型的动态口罩佩戴识别安卓Android程序设计

禁止完全抄袭&#xff0c;引用注明出处。 下载地址 前排提醒&#xff1a;文件还没过CSDN审核&#xff0c;GitHub也没上传完毕&#xff0c;目前只有模型的.pt文件可以下载。我会尽快更新。 所使用.ptl文件 基于Yolo5的动态口罩佩戴识别模型的pt文件资源-CSDN文库 项目完整文…