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

news2024/11/18 19:39:38

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

文章目录

  • 前言
  • 一、同步互斥与通信是什么?
    • 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.coloradmin.cn/o/905669.html

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

相关文章

wustojc2005中英长度单位换算

#include <stdio.h> int main() {int n, inch;int foot;scanf("%d", &n);foot n /100.0/0.3048;inch (n/100.0/0.3048-foot)*12;printf("%d %d",foot,inch);return 0; }

使用PyMuPDF添加PDF水印

使用Python添加PDF水印的博客文章。 C:\pythoncode\new\pdfwatermark.py 使用Python在PDF中添加水印 在日常工作中&#xff0c;我们经常需要对PDF文件进行处理。其中一项常见的需求是向PDF文件添加水印&#xff0c;以保护文件的版权或标识文件的来源。本文将介绍如何使用Py…

Python自动化测试五种模型

一、前言 在自动化测试中&#xff0c;我们往往将自动化脚本都归纳属于哪种框架模型&#xff0c;比如关键字驱动模型等。 本篇将列举实际自动化测试中&#xff0c;Python 自动化测试的五种模型&#xff1a;线性模型、模块化驱动模型、数据驱动模型、关键字驱动模型、行为驱动模…

大模型框架LangChain开发实战(一)

一、概述 在大模型应用中&#xff0c;通常是基于框架来呼叫模型的&#xff0c;大模型提供了两个最重要的功能&#xff0c;一是提供了具体的intermediate steps&#xff08;即做事情的中间步骤&#xff0c;模型作为reasoning engine&#xff09;&#xff0c;二是提供了evaluati…

vue3实现容器内容滚动到底,触底加载新数据

scroll方式实现 在Vue3中&#xff0c;可以使用ref和onMounted钩子函数获取容器元素并监听滚动事件&#xff0c;判断内容是否滚动到了底部&#xff0c;从而触发加载新数据。 以下是一个简单的示例代码&#xff1a; <template><div class"container" ref&…

Kafka的底层“真面目”

简介 kafka是一个分布式消息队列。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息&#xff0c;消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。 kafka对外使用topic的概念&#xff0c;生产者往topic里写消息&…

并查集路径压缩(Java 实例代码)

目录 并查集路径压缩 Java 实例代码 UnionFind3.java 文件代码&#xff1a; 并查集路径压缩 并查集里的 find 函数里可以进行路径压缩&#xff0c;是为了更快速的查找一个点的根节点。对于一个集合树来说&#xff0c;它的根节点下面可以依附着许多的节点&#xff0c;因此&am…

Redis数据结构之String

String 类型是 Redis 的最基本的数据类型&#xff0c;一个 key 对应一个 value&#xff0c;可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的&#xff0c;意思是 Redis 的 String 可以包含任何数据&#xff0c;比如图片或者序列化的对象&#xff0c;一个 Redi…

【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

如何使用媒体查询(media query)来适配不同设备上的样式?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用媒体查询适配不同设备上的样式⭐ 基本语法⭐ 示例⭐ 常见的媒体特性⭐ 创建响应式布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来…

(2)、将SpringCache扩展功能封装为starter

(2)、将SpringCache扩展功能封装为starter 1、准备工作 前面我们写了一个common-cache模块,尽可能的将自定义的RedisConnectionFactory, RedisTemplate, RedisCacheManager等Bean封装了起来。 就是为了方便我们将其封装为一个Starter。 我们这里直接《SpringCache+Redis实…

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…

Communication Channels

沟通渠道 n * (n - 1) / 2 你1 相关方3 4 4 * 3 / 2 6 你1 相关方3 相关方1 5 5 * 4 / 2 10 人越多&#xff0c;沟通渠道越多&#xff0c;沟通成本理论越高

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…

CSSCI、北核期刊投稿指南(2023年更新)

该数据为经管类的期刊投稿指南&#xff0c;包含发表难度&#xff0c;文章数量&#xff0c;影响因子&#xff0c;用户评价等指标。共5份文件&#xff0c;分别为国内所有期刊信息库、投稿指南&#xff08;CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本&#xff09; 一、…

Risk Probability

风险概率计算 sum p1 * v1 p2 * v2 p3 * v3 ... pn * vn

memmove的实现与使用

memmove与memcpy相比&#xff0c;可以实现同一数组的赋值 memmove要点 1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 2.如果源空间和目标空间出现重叠&#xff0c;就得使用memmove函数处理。 函数实现 void* my_memmove(void* dest, void* sor…

【无监督】5、DINO | 使用自蒸馏和 transformer 来释放自监督学习的超能力(ICCV2021)

文章目录 一、背景二、相关工作三、方法四、效果 论文&#xff1a;Emerging Properties in Self-Supervised Vision Transformers 代码&#xff1a;https://github.com/facebookresearch/dino 出处&#xff1a;ICCV2021 | FAIR DINO&#xff1a; self-DIstillation with NO …

Ubuntu服务器service版本初始化

下载 下载路径 官网&#xff1a;https://cn.ubuntu.com/ 下载路径&#xff1a;https://cn.ubuntu.com/download 服务器&#xff1a;https://cn.ubuntu.com/download/server/step1 点击下载&#xff08;22.04.3&#xff09;&#xff1a;https://cn.ubuntu.com/download/server…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)一(112)

需求&#xff1a;&#xff1a; 有一个List<Map<String.Object>>,存储了某年某月的数据&#xff0c; 数据是根据用户查询条件进行显示的&#xff1b;所以查询的数据是动态的&#xff1b;需按月份统计每个年月数据出现的次数&#xff0c;并且按照月份排序&#xff1…