【Freertos基础入门】同步互斥与通信

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、同步互斥与通信是什么?
    • 1.基础概念
    • 2.freertos通信可用的手段
  • 二、同步与互斥的概念
  • 三、各类通信的区别与适用场景
  • 总结


前言

本系列基于stm32系列单片机来使用freerots

任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。
在这里插入图片描述


一、同步互斥与通信是什么?

1.基础概念

在 FreeRTOS 中,同步、互斥和通信是用来处理多个任务之间协作的概念。

同步:

同步是指任务之间按照某种规则进行协调和按序执行的过程。
想象一下,你在路口等红绿灯时,车辆按照交通信号灯的规则进行停止和行驶。这种等待和执行的行为就是同步。
在 FreeRTOS 中,同步用于在多个任务之间控制其执行的顺序和时间。

互斥:

互斥是指在多任务环境中,运行特定代码段时确保数据的一致性和完整性,避免多个任务同时访问和修改共享资源导致错误的发生。
想象一下,当多个人共用一台复印机时,只有一个人可以占用复印机,其他人必须等待。这个过程中,复印机的访问通过互斥来控制,避免冲突和混乱。
在 FreeRTOS 中,互斥用于保护共享资源(如全局变量、队列等),确保任务访问这些资源时的原子性,避免数据错误。

通信:

通信是指任务之间交换信息和共享数据的过程,让彼此知道发生了什么,传递必要的信息和状态。
想象一下,你给朋友发短信告诉他你的最新计划,这是一种通信的方式,让你们彼此了解对方的行动和意图。
在 FreeRTOS 中,通信用于任务之间传递数据、事件和消息。可以使用消息队列、信号量、事件标志等机制来实现任务之间的通信。
总结来说,在 FreeRTOS 中:

同步用于控制任务的执行顺序和时间。
互斥用于保护共享资源,避免多个任务同时访问导致的错误。
通信用于任务之间传递数据和消息,实现信息的交换和共享。
这些概念在多任务系统中非常重要,帮助实现协作和共享资源的有效管理和利用。

2.freertos通信可用的手段

在freertos中用于任务通信有下面这些手段,在后面我们会一一讲解任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等

二、同步与互斥的概念

当我们在设计多任务程序时,经常会遇到需要任务之间相互合作和协调的情况。在 FreeRTOS 中,同步和互斥是用来处理这种情况的概念。

同步

同步就像我们在交通路口等待红绿灯一样。每个车辆必须按照交通规则依次通过,不能同时一起闯红灯,否则会发生混乱和事故。
在 FreeRTOS 中,同步用于控制任务的执行顺序和时间。例如,一个任务必须等待另一个任务完成某个操作后才能继续执行,或者多个任务必须按照特定的顺序执行。

互斥

互斥就像我们共享一台复印机的情况。只有一个人能够使用复印机,其他人必须等待,以避免多人同时操作复印机导致混乱和错误。
在 FreeRTOS 中,互斥用于保护共享资源,例如全局变量或设备。只有一个任务能够访问这些资源,其他任务必须等待或互斥地使用资源,以确保数据的正确性和一致性。
通过同步和互斥的机制,我们能够有效地协调任务之间的操作和访问共享资源的时序关系。这样可以避免任务之间的冲突和混乱,确保程序的正确性和稳定性。

在 FreeRTOS 中,实现同步和互斥的机制包括信号量、互斥量和事件标志等。这些机制可以让任务之间进行合理的协作和互斥,确保任务按照预期的顺序执行并正确地访问共享资源。

总结来说,同步用于控制任务执行顺序和时间,互斥用于保护共享资源,避免冲突和混乱。它们是多任务编程中必不可少的概念,帮助管理任务间的协调和保护共享资源的访问。

三、各类通信的区别与适用场景

freertos的通信主要有下面这几种:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)

当多个任务之间需要进行通信和同步时,FreeRTOS 提供了不同的机制来实现这些功能。以下是任务通知、队列、事件组、信号量和互斥量之间的区别:

1.任务通知(Task Notification):

2.任务通知是一种轻量级的通信机制,用于任务之间的同步和事件触发。
3.任务之间可以通过给对方发送任务通知来实现同步和通信,通知可以携带一些信息或信号,例如触发某个任务执行特定操作。
4.任务通知适用于任务之间的简单同步和事件触发,但不适用于传递大量数据。

5.队列(Queue):

6.队列是一种先进先出(FIFO)的数据结构,用于在任务之间传递数据。
7.一个任务可以向队列发送数据,而另一个任务可以从队列中接收数据。这样可以实现任务之间的异步通信和数据传递。
8.队列适用于任务之间需要传递和共享数据的场景,可以存储多个数据项,并按照发送顺序进行处理。

9.事件组(Event Group):

10.事件组是一种管理和同步任务之间事件状态的机制。
11.每个任务可以设置或清除事件组的特定位,其他任务可以等待特定的位或多个位被设置或清除来进行同步操作。
12.事件组适用于需要任务之间精确的同步和事件触发,可以在不同任务之间传递事件状态。

13.信号量(Semaphore):

14.信号量是一种计数器,用于限制对共享资源的访问。
15.任务可以获取或释放信号量,当信号量计数器为零时,任务将被阻塞,直到信号量可用。
16.信号量适用于限制对共享资源的并发访问,可以控制任务之间的竞争条件。

17.互斥量(Mutex):

18.互斥量是一种特殊的信号量,用于实现对共享资源的互斥访问。
19.只有一个任务可以获取互斥量,并且其他任务必须等待互斥量释放后才能访问共享资源。
20.互斥量适用于保护共享资源,确保在任何时刻只有一个任务能够访问它。

总结来说,他们有这些适用场景:

21.任务通知用于任务间的简单同步和事件触发;
22.队列适用于任务间的数据传递和共享;
23.事件组用于任务间的精确同步和事件触发;
24.信号量用于限制共享资源的并发访问;
25.互斥量用于保护共享资源的互斥访问。

根据具体的应用场景和需求,选择适合的通信机制可以实现任务之间的有效协作和资源管理。


总结

在FreeRTOS中,同步互斥与通信是实现任务之间有效协作的重要概念。本文对FreeRTOS中的同步互斥与通信机制进行了总结,以帮助读者理解它们的作用和特点。

首先,介绍了任务通知作为一种轻量级通信机制。任务通知可以用于任务之间的同步和事件触发。这种机制适用于简单的同步需求,可以通过发送通知来实现任务之间的同步和通信。

其次,讨论了队列作为一种常用的通信机制。使用队列,任务可以通过发送和接收数据来实现异步通信和数据传递。队列适用于需要在任务之间共享和传递数据的场景,可按照先进先出的原则处理数据项。

然后,探讨了事件组作为管理和同步任务之间事件状态的机制。任务可以设置和清除事件组的特定位,其他任务可以等待特定位或多个位的状态来进行同步操作。事件组适用于需要精确同步和事件触发的情况,可在任务之间传递事件状态。

接着,介绍了信号量作为限制对共享资源访问的计数器。任务可以获取或释放信号量,当信号量计数器为零时,任务将被阻塞。信号量适用于控制任务之间对共享资源的并发访问,以避免竞争条件的发生。

最后,讨论了互斥量作为特殊的信号量,用于实现对共享资源的互斥访问。只有一个任务可以获取互斥量,其他任务必须等待互斥量释放后才能访问共享资源。互斥量适用于保护共享资源,确保只有一个任务能够访问它。

通过对这些同步互斥与通信机制的了解,开发人员可以根据具体需求选择合适的机制来实现任务之间的协作与资源管理。使用适当的机制可以提高系统的可靠性和效率。

总结来说,任务通知、队列、事件组、信号量和互斥量是FreeRTOS中常用的同步互斥与通信机制。通过灵活运用这些机制,开发人员可以实现任务之间的有效通信与协作,满足不同的应用需求。

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

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

相关文章

next.js 创建 react ant design ts 项目

环境说明:next.js 官方文档要求node版本在16.8以上。笔者使用的 node版本是16.20.1,不要使用16.13.0,笔者在使用 node16.13.0环境时创建的 react 项目点击事件无效 next.js官网截图 next.js 官网:https://nextjs.org/ react 官网…

gor工具http流量复制、流量回放,生产运维生气

gor是一款流量复制回放工具,gor工具的官网:https://goreplay.org/ 1、对某个端口的http流量进行打印 ./gor --input-raw :8000 --output-stdout 2、对流量实时转发,把81端口流量转发到192.168.3.221:80端口 ./gor --input-raw :81--output-ht…

学C的第三十四天【程序环境和预处理】

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十三天【C语言文件操作】_高高的胖子的博客-CSDN博客 1 . 程序的翻译环境和执行环境 在ANSI C(C语言标准)的任何一种实现中,存在两个不同的环境。 &#xff0…

如何取消订阅IEEE membership的email

最近小虎开了一个IEEE Student Member,邮箱都快被IEEE给爆箱了。所以想办法取消订阅其邮件,但是保留其member身份。 方法 在profile界面选择communication preferences and policies, Uncheck所有communications,选择I only want to recei…

Java之接口

作者简介: zoro-1,目前大一,正在学习Java,数据结构等 作者主页: zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 Java之接口 接口的概念语法规则接口特性接口使用案…

DTC 19服务学习2

紧跟上篇 0x04 reportDTCSnapshotRecordByDTCNumber 通过DTC和快照序列来获取DTC快照记录。 适用以下假设: — 服务器支持存储给定 DTC 的两个 DTCSnapshot 记录的能力。 — 此示例假定是上一个示例的延续。 — 假设服务器请求服务器存储的 DTC 编号 123456 的两个…

攻防世界-backup

原题 解题思路 备份文件后缀大多是bak、git、svn、swp等,尝试index.php.bak就有文件下载了:

1、攻防世界第一天

1、网站目录下会有一个robots.txt文件,规定爬虫可以/不可以爬取的网站。 2、URL编码细则:URL栏中字符若出现非ASCII字符,则对其进行URL编码,浏览器将该请求发给服务端;服务端会可能会先对收到的url进行解码&#xff0…

【HBZ分享】java中的BitSet 与 Redis中的BitMap 与 布隆过滤器

BitMap的存储原理 bitMap他会标识出某个整数是否存在,存在即为1,不存在对应位即为0bitMap是存储int类型的,int 4byte, 1byte 8bit,因此bitMap数组中的每个下标可以标识出32个数字是否存在bitMap相当于一个个小格子&…

解决方案:如何在 Amazon EMR Serverless 上执行纯 SQL 文件?

《大数据平台架构与原型实现:数据中台建设实战》一书由博主历时三年精心创作,现已通过知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详…

IP 地址监控工具

地址监控实用程序是一套 IP 工具,包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器,用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控,用于管理 DNS 名称、网络的 IP 和 MAC 地址,并跟踪 IP 地址。 IP…

uniapp配置添加阿里巴巴图标icon流程步骤

文章目录 下载复制文件到项目文件夹里项目配置目录结构显示图标 下载 阿里巴巴icon官网 https://www.iconfont.cn/ 复制文件到项目文件夹里 项目配置目录结构 显示图标

智能监控系统的守护者:人工智能行为识别技术的崛起与发展

人工智能助力监控系统:行为识别在安全监控中的应用与挑战 摘要: 随着人工智能技术的快速发展,行为识别在监控系统中的应用逐渐成为安全监控领域的重要工具。本文将详细探讨人工智能行为识别技术在监控系统中的应用,以及在实际应用…

JVM中分代回收机制

为什么要分为新生代和老年代? 分为新生代(Young Generation)和老年代(Old Generation)是为了更有效地管理和优化内存的使用。 新生代主要存放生命周期较短的对象,例如方法的局部变量、临时变量等。由于这…

数据结构-二叉树

在学习二叉树之前.必须先要掌握一些树的重要概念: 结点的度:一个结点含有的子树个数称为该结点的度.树的度:一棵树中,所有节点度的最大值称为树的度.叶子结点:度为0的结点称为叶子节点.(也叫终端结点)双亲结点:若一个结点含有子结点,则这个结点称为其子结点的双亲结点(也叫父节…

Egg.js构建一个stream流式接口服务

经常需要用到 stream 流式接口服务,比如:大文件下载、日志实时输出等等。本文将介绍如何使用Egg.js构建一个 stream 流式接口服务。 一、准备工作 目录结构: app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 测试文件,最好…

申请部署阿里云SSL免费证书

使用宝塔自动创建的证书有时候会报NET::ERR_CERT_COMMON_NAME_INVALID,并且每次只能三个月,需要点击续期非常麻烦,容易遗忘。 阿里云免费SSL证书 前往阿里云管理控制台【数字证书管理服务】【SSL证书】,每年20个额度,一…

17.HPA和rancher

文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源&…

docker+haror

docker 2013年诞生,推荐单容器只运行一个程序或进程,形成一个分布式的应用模型。 总结下来就是:docker带来启动流程更快,运行效率较高、资源损耗较小,属于轻量级的服务。 docker的安装 推荐的一键化安装的脚本&#…

STM8遇坑[EEPROM读取debug不正常release正常][ STVP下载成功单运行不成功][定时器消抖莫名其妙的跑不通流程]

EEPROM读取debug不正常release正常 这个超级无语,研究和半天,突然发现调到release就正常了,表现为写入看起来正常读取不正常,这个无语了,不想研究了 STVP下载不能够成功运行 本文摘录于:https://blog.csdn.net/qlexcel/article/details/71270780只是做学习备份之…