FreeRTOS学习——FreeRTOS队列(上)

 

本篇文章记录我学习FreeRTOS队列的相关知识,主要包括队列简介、队列的结构体、队列创建等知识。

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以也称为消息队列。FrecRTOS 中的信号量的也是依据队列实现的!所以有必要深入的了解FreeRTOS的队列。


希望我的分享对你有所帮助。

目录

一、什么是FreeRTOS的队列 

1、数据存储 

 2、多任务访问

3、出队阻塞 

4、入队阻塞

5、队列操作详解图

Step1  创建队列

Step2  向队列发送第一个消息

二、队列结构体

三、结语



一、什么是FreeRTOS的队列 

FreeRTOS队列是用于在FreeRTOS实时操作系统中进行任务间通信的一种机制。队列允许任务以先进先出(FIFO)的顺序共享数据,这样任务就可以安全地传递消息、数据或事件。队列的使用可以帮助在多任务环境中实现任务之间的协作和数据传输。

当在FreeRTOS中创建一个队列时,可以指定队列的长度以及每个队列项的大小。任务可以使用队列的API函数来向队列发送数据(入队)或接收数据(出队)。以下是一些常用的队列API函数:

  1. xQueueCreate(): 创建一个队列,并指定队列的长度和每个队列项的大小。
  2. xQueueSend(): 向队列发送数据,将数据放入队列中。
  3. xQueueReceive(): 从队列接收数据,将队列中的数据取出并返回给任务。
  4. uxQueueMessagesWaiting(): 获取当前在队列中等待的消息数量。
  5. uxQueueSpacesAvailable(): 获取队列中剩余的空闲空间数量。

使用队列的好处包括:

  • 任务间解耦:任务之间通过队列通信,可以减少任务之间的耦合度,提高代码的模块化程度。
  • 数据传输:任务可以通过队列传输数据,实现数据共享和同步。
  • 事件通知:一个任务可以向队列发送事件或信号,另一个任务可以通过接收队列中的消息来得知事件发生。
  • 避免竞态条件:使用队列可以避免多任务环境下的竞态条件,提高系统的稳定性和可靠性。

1、数据存储 

通常队列采用先进先出(FIFO)的存储缓冲机制,也就是往队列发送数据的时候(也叫入队)永远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的。但是也可以使用LIFO的存储缓冲,也就是后进先出,FreeRTOS 中的队列也提供了LIFO的存储缓冲机制。


数据发送到队列中会导致数据拷贝,也就是将要发送的数据拷贝到队列中,这就意味着在队列中存储的是数据的原始值,而不是原数据的引用(即只传递数据的指针),这个也叫做值传递。

学过UCOS的同学应该知道,UCOS的消息队列采用的是引用传递,传递的是消息指针。采用引用传递的话消息内容就必须一直保持可见性,也就是消息内容必须有效,那么局部变量这种可能会随时被删掉的东西就不能用来传递消息,但是采用引用传递会节省时间啊!因为不用进行数据拷贝。


采用值传递的话虽然会导致数据拷贝,会浪费一点时间,但是一旦将消息发送到队列中原始的数据缓冲区就可以删除掉或者覆写,这样的话这些缓冲区就可以被重复的使用。

FreeRTOS中使用队列传递消息的话虽然使用的是数据拷贝,但是也可以使用引用来传递消息啊,我直接往队列中发送指向这个消息的地址指针不就可以了!这样当我要发送的消息数据太大的时候就可以直接发送消息缓冲区的地址指针,比如在网络应用环境中,网络的数据量往往都很大的,采用数据拷贝的话就不现实。

 2、多任务访问

队列不是属于某个特别指定的任务的,任何任务都可以向队列中发送消息,或者从队列中提取消息。

3、出队阻塞 

当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是当任务从队列中读取消息无效的时候任务阻塞的时间。

出队就是就从队列中读取消息,出队阻塞是针对从队列中读取消息的任务而言的。

比如任务A用于处理串口接收到的数据,串口接收到数据以后就会放到队列Q中,任务A从队列Q中读取数据。但是如果此时队列Q是空的,说明还没有数据,任务A这时候来读取的话肯定是获取不到任何东西,那该怎么办呢?任务A现在有三种选择,一:二话不说扭头就走,二:要不我在等等吧,等一会看看,说不定一会就有数据了,三:死等,死也要等到你有数据!

选哪一个就是由这个阻塞时间决定的,这个阻塞时间单位是时钟节拍数。阻塞时间为0的话就是不阻塞,没有数据的话就马上返回任务继续执行接下来的代码,对应第一种选择。如果阻塞时间为0~portMAX_DELAY,当任务没有从队列中获取到消息的话就进入阻塞态,阻塞时间指定了任务进入阻塞态的时间,当阻塞时间到了以后还没有接收到数据的话就退出阻塞态,返回任务接着运行下面的代码,如果在阻塞时间内接收到了数据就立即返回,执行任务中下面的代码,这种情况对应第二种选择。当阻塞时间设置为portMAX_DELAY的话,任务就会一直进入阻塞态等待,直到接收到数据为止!这个就是第三种选择。

4、入队阻塞

入队说的是向队列中发送消息,将消息加入到队列中。和出队阻塞一样,当一个任务向队列发送消息的话也可以设置阻塞时间。比如任务B向消息队列Q发送消息,但是此时队列Q是满的,那肯定是发送失败的。此时任务B就会遇到和上面任务A一样的问题,这两种情况的处理过程是类似的,只不过一个是向队列Q发送消息,一个是从队列Q读取消息而已。

5、队列操作详解图

Step1  创建队列

图中任务A要向任务B发送消息,这个消息是x变量的值。首先创建一个队列,并且指定队列的长度和每条消息的长度。这里我们创建了一个长度为4的队列,因为要传递的是x值,而x是个int类型的变量,所以每条消息的长度就是 int类型的长度,在STM32中就是4字节,即每条消息是4个字节的。

Step2  向队列发送第一个消息

图中任务A的变量x值为10,将这个值发送到消息队列中。此时队列剩余长度就是3了。前面说了向队列中发送消息是采用拷贝的方式,所以一旦消息发送完成变量x就可以再次被使用,赋其他的值。

Step3  向队列发送第二个消息

图中任务A又向队列发送了一个消息,即新的x的值,这里是20。此时队列剩余长度为2。

Step4  从队列中读取消息

图中任务B从队列中读取消息,并将读取到的消息值赋值给y,这样y就等于10了。任务B从队列中读取消息完成以后可以选择清除掉这个消息或者不清除。当选择清除这个消息的话其他任务或中断就不能获取这个消息了,而且队列剩余大小就会加一,变成3。如果不清除的话其他任务或中断也可以获取这个消息,而队列剩余大小依旧是2。

二、队列结构体

有一个结构体用于描述队列,叫做Queue_t,这个结构体在文件 queue.c中定义如下:

三、结语

关于FreeRTOS队列的学习就分享记录至此了,关于队列的创建、队列发送消息、队列上锁和解锁、队列读取消息、队列操作实验等知识,持续更新中…

 

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

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

相关文章

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time 问题描述解决办法方式一方式二 小结 问题描述 在Android应用开发过程中,经常需要自定义控件,并且定义控件的属性,方便灵活的修改控件的显示样式,提…

IT廉连看——UniApp——样式绑定

IT廉连看——UniApp——样式绑定 一、样式绑定 两种添加样式的方法: 1、第一种写法 写一个class属性,然后将css样式写在style中。 2、第二种写法 直接把style写在class后面 添加一些效果:字体大小 查看效果 证明这样添加样式是没有问题的…

【提示学习论文】PMF:Efficient Multimodal Fusion via Interactive Prompting论文原理

Efficient Multimodal Fusion via Interactive Prompting(CVPR2023) 基于交互式提示的高效多模态融合方法减少针对下游任务微调模型的计算成本提出模块化多模态融合架构,促进不同模态之间的相互交互将普通提示分为三种类型,仅在单…

websocket 单点通信,广播通信

Websocket协议是对http的改进,可以实现client 与 server之间的双向通信; websocket连接一旦建立就始终保持,直到client或server 中断连接,弥补了http无法保持长连接的不足,方便了客户端应用与服务器之间实时通信。 参…

大数据005-hadoop003-了解MR及Java的简单实现

了解MapReduce MapReduce过程分为两个阶段:map阶段、reduce阶段。每个阶段搜键-值对作为输入和输出。 要执行一个MR任务,需要完成map、reduce函数的代码开发。 Hellow World 【Hadoop权威指南】中的以分析气象数据为例,找到每年的最高气温。…

Jenkins持续化集成

优质博文:IT-BLOG-CN 工作过程如下环境准备 开发人员提交代码>jenkins获取代码>调用单元测试>打包>发布 环境准备Jenkins的安装 Tomcat、Maven、Git或Svn、Jdk Jenkins的安装 1、官网下载war :http://Jenkins-ci.org/ 2、tomcat-users.…

NTFS文件权限管理

实验环境 windows server 2016 实验要求 实验步骤 1、 新建文件 2、打开文件夹的属性->安全->高级 3、禁用继承 4、添加组或用户 技术资料: 常用软件: 手机端项目: 电脑端项目: 公司制度: 销售资源&#xff…

【Scala---01】Scala『 Scala简介 | 函数式编程简介 | Scala VS Java | 安装与部署』

文章目录 1. Scala简介2. 函数式编程简介3. Scala VS Java4. 安装与部署 1. Scala简介 Scala是由于Spark的流行而兴起的。Scala是高级语言,Scala底层使用的是Java,可以看做是对Java的进一步封装,更加简洁,代码量是Java的一半。 因…

JAVA读取从WPS在Excel中嵌入的图片资源

读取从WPS在Excel中嵌入的图片资源 引言 许多数据文件中可能包含嵌入式图片,这些图片对于数据分析和可视化非常重要。然而,从 WPS 在 Excel 中读取这些图片可能会有一些技术挑战。在本文中,我将展示如何从 WPS Excel 文件中读取嵌入的图片&am…

海外三大AI图片生成器对比(Stable Diffusion、Midjourney、DALL·E 3)

Stable Diffusion DreamStudio 是Stable Diffusion 的官方网页,价格便宜,对图片的操作性强,但同时编辑页面不太直观,对使用者的要求较高。 与 DALLE 和 Midjourney 不同,Stable Diffusion 是开源的。这也意味着&…

linux tcpdump的交叉编译以及使用

一、源码下载 官网:点击跳转 二、编译 1、解压 tar -xf libpcap-1.10.4.tar.xz tar -xf tcpdump-4.99.4.tar.xz 2、配置及编译 //libpcap: ./configure --hostarm-linux --targetarm-linux CCarm-linux-gcc --with-pcaplinux --prefix$PWD/build//t…

企业如何保证内部传输文件使用的工具是安全的?

企业内部文件的频繁交换成为了日常运营不可或缺的一环。然而,随着数据量的爆炸式增长和网络攻击手段的日益复杂,内网文件传输的安全隐患也日益凸显,成为企业信息安全的薄弱环节。本文将探讨内网文件传输的安全风险、企业常用的防护措施。 内网…

Django之搭配内网穿透

一,安装coplar 二,开启8087的内网穿透 三,setting.py中加入如下配置: ALLOWED_HOSTS [*]CSRF_TRUSTED_ORIGINS ["https://localhost:8087", "http://localhost:8087"]四,启动项目 五&#xff…

STM32之HAL开发——ADC入门介绍

ADC简介 模数转换,即Analog-to-Digital Converter,常称ADC,是指将连续变量的模拟信号转换为离散的数字信号的器件,比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101,这样ADC就建立了模拟世界的传感器和…

第4篇:创建Nios II工程之Hello_World<三>

Q:接着我们再来完成Nios II软件工程设计部分。 A:从Quartus Tools选择Nios II Software Build Tools for Eclipse,打开Nios II SBT软件,Workspace指定到hello_world工程的software文件夹路径;再从File-->New-->…

Linux命令大全 以及搭建hadoop

Liunx系统目录 ├── bin -> usr/bin # 用于存放二进制命令 ├── boot # 内核及引导系统程序所在的目录 ├── dev # 所有设备文件的目录(如磁盘、光驱等) ├── etc # 配置文件默认路径、服务启动命令存放目录 ├── home # 用户家目录&#…

上位机图像处理和嵌入式模块部署(树莓派4b设置ftp下载)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 作为一个开发板,最好支持ftp下载,这样文件的上传和下载都会比较方便。虽然目前为止,利用mobaxterm和ssh也能实现…

ObjectARX特性面板OPM添加动态属性

参考资料 AutoCAD与动态属性PDF文档 https://www.progdomain.com/584/ObjectARX2016 OPM面板全攻略 https://blog.csdn.net/jfmyes/article/details/121392332 准备工作——正确安装ARX和Wizards ARX和VS的版本对应、ObjectArx(2010~2020)工程创建、类添加及错误处理 https:…

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL(Access Control Lists) 4.1.2.6 Watcher(事件…

如何用OceanBase的 Load Data 导入CSV文件

0 前言 CSV文件(Comma-Separated Values,字符分隔值)是一种普遍采用的数据存储格式,有不少企业和机构都用它来进行数据的管理和存储。身为开发者,您可能经常遇到这样的需求:需要将CSV的数据导入OceanBase数…