4-FreeRTOS队列、互斥、信号量

news2024/11/25 12:46:54

1-队列

队列(我对队列的理解就是上体育课,排队这种)是任务之间通信的一种方式。队列可以用于任务和任务之间或者中断和任务之间消息的接收与发送。在多数情况下,他们消息缓冲是按照FIFO(先进先出)原则。也就是最新的数据在上一个数据的后面,换句话说就是,类似于吃羊肉串,比如第一个串起来的,就第一个被吃掉。
下图是队列的数据读写:在这里插入图片描述
FreeRTOS队列用户通常情况下会把灵活性与简单性相结合,但是这种类型通常是属于互斥的。
消息是通过复制的方式经过队列来进行发送,这说明数据的本身被复制到队列中,而不是队列对存储数据的一直引用。这种方式相对来说是较为友好的。主要原因以下几点。

  • 如果已经包含在C变量之中(整型、结构体短小的)是可以直接发送到队列中的。不需要为消息进行缓冲区的分配。
    也可以直接从队列中把消息读取到C变量中。
    除此之外,这种队列发送方式,即使发送的消息仍保留在队列之中,也是允许发送任务立即覆盖发送到队列的缓冲区或者变量。由于变量中包含的数据被复制到队列中,所以变量本身可以重用。无论任务是接收消息还是发送消息,不需要商定是哪个任务接收消息,以及哪个任务负责发送消息。
  • 使用通过复制传递数据的队列并不会阻止使用队列通过引用传递数据。当消息的大小达到某个点时,将整个消息字节复制到队列中是不现实的,则定义队列以保存指针,只将指向消息的指针复制到队列中。
  • 内核完全负责分配用作队列存储区域的内存
  • 可以通过定义结构体成员来保存大小不一的信息,然后再通过队列进行消息的发送和接收。
  • 单个队列可用于接收不同的消息类型和来自多个位置的消息,方法是将队列定义为包含一个结构,该结构具有一个成员保存消息类型,另一个成员保存消息数据(或指向 消息数据)。 如何发送数据取决于消息类型。 这正是管理 FreeRTOS-Plus-UDP IP 堆栈的任务能够使用单个队列接收 ARP 计时器事件通知、从以太网硬件接收的数据包、从应用程序接收的数据包、网络传输事件等。
  • 这种方式的实现适合受到存储器保护的内存环境中使用。在受保护内存区域的任务可以将数据传递给限制在不同受保护内存区域的任务,因为通过调用队列发送函数来调用 RTOS 会提高微控制器的特权级别。 队列存储区只能由 RTOS 访问(具有完全权限)。

提供了一个单独的API中断供内部使用。
提供了一个单独的 API 供在中断内部使用。 将 RTOS 任务使用的 API 与中断服务例程使用的 API 分开意味着 RTOS API 函数的实现不会带来每次执行时检查其调用内存的管理。 使用单独的中断 API 还意味着,在大多数情况下,与替代 RTOS 产品相比,创建 RTOS 感知中断服务例程对最终用户来说更简单。

1.1 队列阻塞

允许队列API函数指向阻塞
当任务从一个空的队列读取的时候,这个任务将被设置为阻塞状态,因为这样不会消耗任何的CPU以及时间,而且其他的任务是可以运行的,直到队列中有数据为止,或者阻塞时间结束。
当任务尝试写入完整队列时,该任务将处于 阻塞的状态(因此它不消耗任何 CPU 时间,并且可以运行其他的任务) 直到队列中的空间可用,或者阻塞结束。
如果在同一队列上有多个阻塞任务,那么优先级高的将最先解除。

2-FreeRTOS 二进制信号量

二进制信号量的主要用于互斥和同步。
二进制信号量和互斥锁非常相似,但有一些细微的区别:互斥锁有优先级继承机制,而二进制信号量没有。这使得二进制信号量能够实现同步(任务之间或任务与中断之间)有更好选择,互斥体成为实现简单互斥较好的选择。互斥锁如何被用作互斥机制的描述同样适用于二进制信号量。
允许信号量的API函数指向阻塞。
阻塞表示当一个任务尝试“获取”一个信号量时,如果该信号量不是立即可用的,该任务应该进入阻塞状态的最大“tick”数。如果有多个任务阻塞在同一个信号量上,那么优先级最高的任务将是该信号量下次可用时被解除阻塞的任务。
将二进制信号量视为只能容纳一个项目的队列。因此,队列只能为空或已满(因此为二进制)。任务和中断 使用队列并不关心队列包含什么 - 他们只想知道队列是空的还是满的。这 可以利用机制来同步(例如)任务与中断。
考虑任务被用于服务外围设备。轮询外围设备将浪费 CPU 资源,并阻止其他任务执行。因此,最好任务大部分时间都处于Blocked状态(允许其他任务执行),并且只在实际有事情需要它做的时候才执行它自己。这是通过二进制信号量在尝试“获取”信号量时让任务块来实现的。然后为外设编写中断例程,当外设需要服务时,该任务仅“提供”信号量。任务 总是“获取”信号量(从队列中读取以使队列为空),但从不“给予”它。中断总是“给予”信号量(写入 到队列以使其满员),但从不接受它。
任务优先级可以用来确保外设及时获得服务——有效地生成一个“延迟中断”方案。(注意,FreeRTOS也有一个内置的延迟中断机制)。另一种方法是使用队列来代替信号量。当这完成时,中断程序可以捕获与外围事件相关的数据,并将其发送到一个队列中给任务。当队列上的数据变为可用时,该任务解除阻塞,从队列中检索数据,然后执行所需的任何数据处理。第二种方案允许中断保持尽可能短的时间,而所有的后处理都发生在一个任务中。
下图是使用信号量使任务与中断同步:中断只会“给出”信号量,而任务只会“获取”信号量。

3-FreeRTOS计数信号量

就像二进制信号量可以被认为是长度为1的队列一样,计数信号量可以被认为是长度大于1的队列。同样,信号量并不关心存储在队列中的数据,但只关心队列是否为空。
计数信号通常用于两种情况:

  • 事件计数
    在这个使用场景中,事件处理程序将在每次事件发生时“给出”一个信号量(信号量计数值递增),而处理程序任务将在每次处理事件时“获取”一个信号量(信号量计数值递减)。因此,计数值是已经发生的事件数和已经处理的事件数之间的差值。在这种情况下,当创建信号量时,计数值应该为零。

  • 资源管理
    在此使用方案中,计数值指示可用的资源数。要获得对资源的控制,任务必须首先获得信号量 - 递减信号量计数值。当计数值达到零时,没有可用资源。当任务完成时 它“提供”信号量的资源 - 递增信号量计数值。在这种情况下,计数值最好为 等于创建信号量时的最大计数值。

4-FreeRTOS互斥锁

互斥体是包含优先级继承机制的二进制信号量。而二进制信号量 是实现同步(任务之间或任务与中断之间)的更好选择,互斥体是实现同步的更好选择。
当互斥用于互斥时,互斥就像保护资源的令牌一样。当一个任务希望访问该资源时,它必须首先获得(“获取”)令牌。当它完成了对资源的处理后,它必须“归还”令牌——允许其他任务有机会访问相同的资源。
互斥体使用相同的信号量访问 API 函数,因此也允许指定块时间。区块时间表示“即时报价”的最大数量 如果互斥锁不能立即可用,则任务在尝试“获取”互斥锁时应进入“已阻止”状态。与二进制信号量不同 但是 - 互斥锁采用优先级继承。这意味着,如果高优先级任务在尝试获取互斥锁(令牌)时阻塞 当前由较低优先级的任务持有,则持有令牌的任务的优先级暂时提高到阻止任务的优先级。此机制 旨在确保优先级较高的任务在尽可能短的时间内保持阻塞状态,从而最大限度地减少“优先级倒置” 这种情况已经发生。
优先级继承不能解决优先级倒置!在某些情况下,它只是将其影响降至最低。硬实时应用程序应设计为此类 优先级倒置首先不会发生。
最好不要从中断中使用互斥:
因为:

  • 它们包括一个优先级继承机制,只有在以下情况下才有意义 互斥锁是从任务中给出和获取的,而不是中断。
  • 中断不能阻塞以等待由 互斥锁变为可用。
  • 下图是:互斥锁对共享资源的访问

5-FreeRTOS 递归互斥

递归使用的互斥锁可以被所有者反复“获取”。在所有者调用之前,互斥锁不再可用 xSemaphoreGiveRecursive() 表示每个成功的 xSemaphoreTakeRecursive() 请求。例如,如果一项任务成功地“采取”了相同的任务 互斥锁 5 次,则互斥锁将不可用于任何其他任务,直到它也“返回”互斥锁正好五次。
这种类型的信号灯使用优先级继承机制,因此“获取”信号量的任务必须始终“返回”信号量一次 的 信号灯 它不再需要。
不能从中断服务例程中使用互斥类型信号量。

不应从中断中使用互斥体,因为:

  1. 它们包括一个优先级继承机制,只有在以下情况下才有意义 互斥锁是从任务中给出和获取的,而不是中断。
  2. 中断不能阻塞以等待由 互斥锁变为可用

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

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

相关文章

文本处理方式方法

概述 从今天开始,我们将开启一段自然语言处理的流程,自然语言可以让来处理、理解以及运用人类的语言,实现机器语言和人类语言之间的沟通桥梁。 文本处理 我们正在进行文本处理的时候,经常会用到文本长度不一致的情况&#xff0c…

Microsoft SQL Server 图书管理数据库的建立

文章目录题目描述创建数据库使用数据库创建三个表外码的表示形式结果展示题目描述 – 新建 “图书管理数据库" – 其中包含三个关系 – 图书(编号,图书名,作者,出版社,类型,单价) – 借阅…

ASP.NET Core 3.1系列(16)——Entity Framework Core之Code First

1、前言 前一篇博客介绍了EFCore中的DB First开发模式,该模式可以根据数据库生成实体类和数据库上下文,因此适用于数据库已经存在的场景。而与之相对应的,Code First主要是根据自定义的实体类和数据库上下文反向构建数据库,因此也…

操作系统02_进程管理_同步互斥信号量_PV操作_死锁---软考高级系统架构师007

存储管理可以分为固定存储管理和分页存储管理。 现在固定存储管理已经不用也不考,但要知道因为固定存储管理指的是整存整取 也就是把一整个程序,比如说10G的游戏全部都存到内存里 这样的话是非常占用内存的,这个固定存储管理现在已经不用了。 然后这里我们主要看分页存储管: …

网页去色变黑白+网页黑白恢复为彩色

前言 特定节日,你会发现网页和app首页都会变成灰色,以此来表达我们的哀思之情。 好奇宝宝想知道各个网站都是使用哪些小技巧来做出这种效果的(由彩变灰,由灰变彩),于是稍微学习了一下… 由灰变彩 稍微想…

USDP集群服务器宕机后集群及组件重启

USDP集群的其中2服务器意外宕机,其中包括一台USDP管理服务节点主机和工作节点主机,服务器重新启动后,USDP智能大数据平台无法登录,启动UDSP服务(/opt/usdp-srv/usdp/bin/start-udp-server.sh)后可以登录&am…

Go1.9.3跑GinDemo

Gin 1. 简介 1.1. 介绍 Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的n…

Linux部署WordPress(宝塔版)

宝塔手册宝塔安装 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 宝塔配置 1.帮助命令:bt2.修改用户名(童心同萌):bt 63.修改密码(123456):bt 54.修改端口(888…

JWT详细介绍

文章目录1 jwt介绍1.1 什么是jwt1.2 使用场景1.2.1 授权1.2.2 信息交换1.3 JWT结构1.3.1 header1.3.2 payload1.3.3 signature 签名2 Python 实现2.1 手动编码2.2 jwt包3 校验 jwt5 js解析jwt1 jwt介绍 官网:https://jwt.io/ 本文以python来进行实战演示 1.1 什么…

KG-开源项目:CMeKG【利用自然语言处理与文本挖掘技术,基于大规模医学文本数据,以人机结合的方式研发的中文医学知识图谱】

CMeKG(Chinese Medical Knowledge Graph)是利用自然语言处理与文本挖掘技术,基于大规模医学文本数据,以人机结合的方式研发的中文医学知识图谱。 项目来源: 中文医学知识图谱CMeKG2.0版发布-自然语言处理实验室北京大…

iOS开发之打包上传到App Store——(一)各种证书的理解

OK,有日子没写iOS开发的相关文章啦,主要是最近的精力都没在这上面,不过既然产品已经快要出来了,就有必要了解一下各种证书啥的(众所周知iOS的一堆证书可是很让人头大呀),最近确实被这个搞得头大…

外汇天眼:随着美元贬值所有世界货币,每个国家都在为自己着想

没有迹象表明各国政府愿意合作,各国被迫靠自己的力量建立防御措施,抵御万能的美元的无情力量。 在美联储的鹰派政策、美国经济强劲以及寻求市场波动避险的投资者的支持下,美元兑所有其他货币正在稳步走强,创下数十年来的最大涨幅。…

信号发生器不会用?一篇文章教会你

信号发生器是一种能提供各种频率、波形和输出电平电信号的设备。在测量各种电信系统或电信设备的振幅特性、频率特性、传输特性及其它电参数时,以及测量元器件的特性与参数时,用作测试的信号源或激励源。 1、信号发生器如何使用 选用与验电器相同电压等…

Gateway--服务网关

目录一、网关简介二、Gateway简介三、Gateway快速入门基础版增强版简写版四、Gateway核心架构基本概念执行流程五、断言内置路由断言工厂内置路由断言工厂的使用自定义路由断言工厂六、 过滤器局部过滤器内置局部过滤器内置局部过滤器的使用自定义局部过滤器全局过滤器内置全局…

ROS MoveIT2(humble)安装总结

版本 系统版本:ubuntu22.04 ROS2版本:humble Moveit版本:moveit2-humble 安装 ROS 2 和 Colcon 如果您在接下来的几个步骤中遇到错误,一个好的开始是返回并确保您已正确安装 ROS 2。用户通常忘记的一个是获取 ROS 2 安装本身。…

手写Redux(一):实现Redux

在React中,组件和组件之间通过props传递数据的规范,极大地增强了组件之间的耦合性,而context类似全局变量一样,里面的数据能被随意接触就能被随意修改,每个组件都能够改context里面的内容会导致程序的运行不可预料。 …

复习计算机网络——第二章记录(2)

理解一些基本概念: 1、数据(data)是运送信息的实体。 2、信号(signal)是数据的电气的或电磁的表现。 3、数据或信号可以是模拟的,也可以是数字的。 4、所谓“模拟的”就是连续变化的。 5、所谓“数字的…

后端微服务项目中出现的问题整理2022年11月

后端微服务项目中出现的问题整理2022年11月后端微服务项目中出现的问题整理2022年11月1.SpringBoot-Mail-Service(Spring邮箱服务)报错截图解决办法方法一:使用Resource注解方法二:添加(requiredfalse)Resource和Autowired区别2.反…

基于plc的自动洗碗机的设计(西门子)

目 录 摘 要 I Abstract II 1绪论 1 1.1全自动洗碗机的发展 1 1.2全自动洗碗机概述 2 1.2.1 全自动洗碗机的分类 2 1.2.2 全自动洗碗机的基本结构 3 1.2.3 全自动洗碗机的工作原理 4 1.3研究主要内容 4 2 全自动洗碗机机械设计 6 2.1 整体方案设计 6 2.2 各重要部件设计 6 2.2.…

TF-IDF

2.TF - IDF:作用:提取出来一句话中词的重要性,分成两个部分: tf: 词频(某一类中词条出现的次数 / 该类中所有词条数目) idf: 逆文档频率(作用:去掉逗号,的等)公式:idf l…