FreeRTOS同步互斥与通信

本章简介:

本章是概述性的内容。可以把多任务系统当做一个团队,里面的每一个任务就相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统中所涉及的概念,都可以在现实生活中找到例子。 各类RTOS都会涉及这些概念:任务通(tasknotification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。 我们先站在更高角度来讲解这些概念。

同步与互斥的概念

我这里用韦东山老师举的例子

一句话理解同步与互斥:我等你用完厕所,我再用厕所。
什么叫同步?就是:哎哎哎,我正在用厕所,你等会。
什么叫互斥?就是:哎哎哎,我正在用厕所,你不能进来。
同步与互斥经常放在一起讲,是因为它们之的关系很大, 互斥 操作可以使用 同步 来实现。我“ 你用完厕所,我再用厕所。这不就是用 同步 来实现 互斥 吗?再举一个例子。在团队活动里,同事A 先写完报表,经理 B 才能拿去向领导汇报。经理 B必须等同事A 完成报表, AB 之间有依赖, B 必须放慢脚步,被称为同步。在团队活动中,同事A 已经使用会议室了,经理 B 也想使用,即使经理 B 是领导,他也得等着,这就叫互斥。经理B 跟同事 A 说:你用完会议室就提醒我。这就是使用 " 同步 " 来实现 " 互斥 "
有时候看代码更容易理解,伪代码如下:

假设有 A B 两人早起抢厕所, A 先行一步占用了; B 慢了一步,于是就眯一会;当 A 用完后叫醒B B 也就愉快地上厕所了。在这个过程中,A B 是互斥地访问 厕所 厕所 被称之为临界资源。 我们使用了“休眠-唤醒”的同步机制实现了“临界资源”的“互斥访问”。这里埋下伏笔,之后看源码就会恍然大悟, 同一时间只能有一个人使用的资源,被称为临界资源。比如任务A B 都要使用串口来打印,串口就是临界资源。如果A B 同时使用串口,那么打印出来的信息就是 A B 混杂,无法分辨。所以使用串口时,应该是这样:A 用完, B 再用; B 用完, A 再用。

裸机的同步与互斥

在裸机程序里,可以使用一个全局变量或静态变量实现互斥操作,比如要互斥地使用
LCD,可以使用如下代码:
        但是在 RTOS 里,使用上述代码实现互斥操作时,大概率是没问题的,但是无法确保万无一失。 假设如下场景:有两个任务 A、B 都想调用 LCD_PrintString,任务 A 执行到第 4 行代码时发现 bCanUse 为 1,可以进入 if 语句块,它还没执行第 6 句指令就被切换出去了;然后任务 B 也调用 LCD_PrintString,任务 B 执行到第 4 行代码时也发现 bCanUse 为 1,也可以进入 if 语句块使用 LCD。 在这种情况下,使用静态变量并不能实现互斥操作。
        上述例子中,是因为第 4、第 6 两条指令被打断了,那么如下改进:在函数入口处先让bCanUse 减一。这能否实现万无一失的互斥操作呢?

 

 把第 4 行的代码使用汇编指令表示如下:

假设如下场景:有两个任务 A、B 都想调用 LCD_PrintString,任务 A 执行到第 04.1 行代码时读到的 bCanUse 为 1,存入寄存器 R0 就被切换出去了;然后任务B也调用LCD_PrintString,任务 B 执行到第 4 行时发现 bCanUse 为 1 并把它减为 0,执行到第 5 行代码时发现条件成立可以进入 if 语句块使用 LCD,然后任务 B 也被切换出去了;现在任务A 继续运行第 04.2 行代码时 R0 为 1,运行到第 04.3 行代码时把 bCanUse 设置为 0,后续也能成功进入 if 的语句块。在这种情况下,任务 A、B 都能使用 LCD。
上述方法不能保证万无一失的原因在于:在判断过程中,被打断了。如果能保证这个过程不被打断,就可以了: 通过关闭中断来实现,RTOS的核心操作。 
       
示例 1 的代码改进如下:在第 5~7 行前关闭中断。

 示例 2 的代码改进如下:在第 5 行前关闭中断。

各类方法的对比 

高能:

        能实现同步、互斥的内核方法有:任务通知(task notification)、队列(queue)、事件组 (event group)、信号量(semaphoe)、互斥量(mutex)。理解这几个,你就能用FreeRTOS来做出你第一个项目了。
         它们都有类似的操作方法: 获取/释放、阻塞/唤醒 、超时。比如:
-- 任务 A 获取资源,用完后任务 A 释放资源
--  任务 A 获取不到资源则阻塞,任务 B 释放资源并把任务 A 唤醒
--  任务 A 获取不到资源则阻塞,并定个闹钟; A 要么超时返回,要么在这段时间内因为任务B释 放资源而被唤醒。
        这些内核对象五花八门,记不住怎么办?我也记不住,通过对比的方法来区分它们。
--  能否传信息?还是只能传递状态? 事件组
--  为众生(所有任务都可以使用)?只为你(只能指定任务使用)? 队列,事件组,信息量/任务通知,互斥量。
--  我生产,你们消费? 队列
--  我上锁,只能由我开锁, 互斥量

 

使用图形对比如下:
队列:
        -- 里面可以放任意数据,可以放多个数据
        -- 任务、ISR 都可以放入数据;任务、 ISR 都可以从中读出数据
  事件组:
        -- 一个事件用一 bit 表示, 1 表示事件发生了, 0 表示事件没发生
        -- 可以用来表示事件、事件的组合发生了,不能传递数据
        -- 有广播效果:事件或事件的组合发生了,等待它的多个任务都会被唤醒
  信号量:
        -- 核心是 " 计数值 "
        -- 任务、 ISR 释放信号量时让计数值加 1
        -- 任务、 ISR 获得信号量时,让计数值减 1
  任务通知:
        -- 核心是任务的 TCB 里的数值
        -- 会被覆盖
        -- 发通知给谁?必须指定接收任务
        -- 只能由接收任务本身获取该通知
 互斥量:
        -- 数值只有 0 1
        -- 谁获得互斥量,就必须由谁释放同一个互斥量

总结:

经过对本篇的概述,如果你以前学过的话,可以加深你对FreeRTOS的了解,如果你是初学,可以帮你对RTOS有一个大概的掌握,后续我将会对这些一个个展开讲解,并且会从内部机制来对其进行分析,让你不止会用,而且还知道为什么可以这样用。 

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

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

相关文章

Java大厂面试题第2季

一、本课程前提要求和说明 面试题1: 面试题2: 面试题3: 面试题4: 面试题5: 高频最多的常见笔试面试题目 ArrayList HashMap 底层是什么东东 JVM/GC 多线程与高并发 java集合类

【科研基础】证明积累

1-Bayesian Estimation (P317) Suppose that x = θ + ν w h e r e ν i s a n N ( 0 , σ ) random variable and θ is the value of a n N ( θ 0 , σ 0 ) random variable θ (Fig. 8-7). Find the bayesian estimate θ o f θ . \begin{align…

大学校园广播“录编播”与IP校园公共广播系统技术方案

一、项目概述 1、校园IP网络广播系统概述 大学校园广播系统是学校整个弱电系统中的子系统,它是每个学校不可缺少的基础设施之一,在传递校园文化、传播校园新闻资讯方面发挥着重要的作用。近几年来,虽然视频技术和网络技术在飞速发展&#xf…

操作系统的体系结构:宏内核和微内核

操作系统的体系结构是一个开放的问题。操作系统在核心态为应用程序提供公共的服务,那么操作系统在核心态应该提供什么服务、怎样提供服务?有关这个问题的回答形成了两种主要的体系结构:宏内核和微内核。 宏内核:大而全 宏内核系统…

2024蓝桥杯国赛C++研究生组游记+个人题解

Day0 开始复习,过了一遍大部分板子 本来打算再学一遍SAM,但是想到去年考了字符串大题今年应该不会再考了吧。。 过了一遍数据结构和图论,就1点了 两点的时候还没睡着,舍友打游戏好像打到2点过。。 Day1 相当困 第一题&…

word里面没有Acrobat选项

加载项被禁止,选择项里面,没有Acrobat选项 文件-》选项 加载项-》com加载项-》转到 添加Acrobat 出现Acrobat选项

[Qt]关于QListWidget、QScrollArea 为什么在QDesigner上设置了之后界面上仍然不生效的问题

前言 最近做了一些有关QListWidget和QScrollArea的控件,我去,这两个控件是真的坑,明明我在QDesigner的操作界面上对这两个控件的界面进行了修改,但是编译出来的软件就是看上去什么都没有,很坑,Gpt也没解决…

【linux】宝塔,首页挂载磁盘,显示使用情况

挂载前: 挂载后: 数据无价,建议:备份需要挂载的磁盘,或者使用新磁盘来进行操作。 1、下载自动挂载磁盘的脚本: wget -O auto_disk.sh http://download.bt.cn/tools/auto_disk.sh 2、给脚本添加执行权限&a…

Re0:从零开始的C++游戏开发 【下】

Re0:从零开始的C游戏开发 (下) 这是蒟蒻观看B站upVoidmatrix的课程从零开始的提瓦特幸存者的个人笔记【自用】 前言:采用适用于小白的easyx图形库。 第三集 提瓦特の幸存者(下) 3.1 用户界面实现和设计模式基础 3…

省级交通运输行政执法综合管理平台项目实施方案

背景 党的十八届四中全会提出全面推进依法治国的总目标和重大任务。全会通过的《中共中央关于全面推进依法治国若干重大问题的决定》,开启了中国法治建设的新时代,依法治国已经成为党领导人民治理国家的基本方略。 为了贯彻和落实《交通运输信息化“十三…

资深人士称:AI开发游戏会降低游戏成本和体验,不会降低就业率

易采游戏网6月1日最新消息:本周在TD Cowen会议上,R星的母公司Take-Two的CEO Strauss Zelnick对于人工智能(AI)是否会影响游戏开发行业表达了自己的看法。他坚定地认为,AI绝对会改变游戏的制作方式,但不会降低游戏行业的就业水平。…

Maven打包错误:无效的源发行版:17

1. 报错问题 在用maven进行打包时(clean & install),报如下错误: 一开始让我很摸不着头脑,我确定我的pom.xml,还有IDEA中的Project Settings是正确的。 2. 排查 尽管确定,但还是一个个排…

秒杀基本功能开发(显示商品列表和商品详情)

文章目录 1.数据库表设计1.商品表2.秒杀商品表3.修改一下秒杀时间为今天到明天 2.pojo和vo编写1.com/sxs/seckill/pojo/Goods.java2.com/sxs/seckill/pojo/SeckillGoods.java3.com/sxs/seckill/vo/GoodsVo.java 3.Mapper编写1.GoodsMapper.java2.GoodsMapper.xml3.分别编写Seck…

在浏览器里面输入 url,到浏览器显示页面中间发生了什么?

当用户在浏览器中输入URL(例如https://www.example.com)按下回车键,到浏览器显示页面,这中间浏览器会执行以下步骤: 浏览器解析URL:浏览器解析URL,提取出协议(如HTTP或HTTPS&#xf…

每天一个数据分析题(三百四十二)

根据量化对象是业务行为结果还是财务行为结果,可以将指标分为业务指标及财务指标两大类,以下说法正确的是? A. 财务指标是按照财务规则来对财务情况进行量化的指标 B. 业务指标是按照业务规则来对业务情况进行量化的指标 C. 业务指标需要按…

VS(visual studio)搭建QT开发环境插件安装

优先安装QT Qt6 官网QtCreator 下载与安装方法win10_qt6下载-CSDN博客 如果安装vs2019,打开installer,安装c环境 选择c 下载vsix后,双击安装即可。 插件下载: Index of /qtproject/official_releases/vsaddin/ 创建QT项目: 创建完成&…

4K高刷显示器 - 蚂蚁电竞ANT27VU

可以毫不夸张地说,每一局游戏最终能够取得胜利,实际上都与一套极为优秀的电竞 PC 有着紧密的关联,因为其能够提供强大的性能支持与流畅的体验。同样的道理,一套优秀的电竞 PC 若想发挥出最佳的效果,那也都离不开一台能…

leetCode-hot100-数组专题之求和+数学定理+其他

数组专题之求和数学定理其他 求和1.两数之和15.三数之和 数学定理169.多数元素 其他4.寻找两个正序数组的中位数128.最长连续序列 求和 数组求和问题,即计算数组中所有元素的总和,是编程中常见的任务。以下是一些常用的解决方法: 1. 循环遍历…

介绍一下js的节流与防抖

在JavaScript中,节流(Throttling)和防抖(Debouncing)是两种常用的优化高频率触发事件的策略。它们主要用于限制函数的执行频率,以避免因频繁触发导致的性能问题。 1. 防抖(Debouncing&#xff…

numpy.ndarray是什么类型

numpy.ndarray是什么类型 numpy.ndarray 类型的特点创建 numpy.ndarray示例代码总结 numpy.ndarray是什么类型 numpy.ndarray 是 NumPy 库中的一个核心数据类型,用于表示多维数组。它是 NumPy 中最重要的数据结构之一,提供了高效的数值计算能力。下面是对…