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…

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

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

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…

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

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

资深人士称: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…

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 若想发挥出最佳的效果,那也都离不开一台能…

【Java】面向对象的三大特征:封装、继承、多态

封装 什么叫封装? 在我们写代码的时候经常会涉及两种角色: 类的实现者 和 类的调用者。 封装的本质就是让类的调用者不必太多的了解类的实现者是如何实现类的, 只要知道如何使用类就行了,这样就降低了类使用者的学习和使用成本&a…

游戏主播到底是为游戏宣传还是蹭游戏带来的热度

易采游戏网6月1日最新消息:近日知名游戏主播周淑怡在社交平台上发表了自己对《地下城与勇士》手游(简称DNF手游)的点评。作为一款拥有庞大粉丝基础的端游改编作品,DNF手游自发布以来便受到了广泛关注。而周淑怡的点评不仅聚焦于游戏体验本身,…

Python代码:二十七、append函数

1、题目 牛牛有一个name [Niumei, YOLO, Niu Ke Le, Mona] 记录了他最好的朋友们的名字,请创建一个二维列表friends,使用append函数将name添加到friends的第一行。 假如Niumei最喜欢吃pizza,最喜欢数字3,YOLO最喜欢吃fish&…

Linux实验报告(一)——Linux系统安装与简单配置

目录 一、实验名称: 二、仪器、设备: 三、参考资料: 四、实验目的: 五、实验内容(步骤): 六、实验数据(程序)记录: 七、实验结果分析: 八、…

XXE漏洞简介

目录 漏洞原理 漏洞危害 前置知识 XML简介 DTD简介 DTD的两种声明方式 实体 实体分类 内置实体(Built-inentities) 字符实体(Characterentities) 通用实体(Generalentities) 参数实体(Parameterentities) XXE漏洞…

嵌入式Linux shell编程实例

1. 输入两个数,实现两个数的相加 (1)具体实现代码如下 1 #!/bin/bash2 read a3 read b4 sum$(($a$b))5 echo "$sum"(2)编辑完内容后按Esc键再输入:wq保存,回车退出,执行结果如下图&a…

系统安全及其应用

系统安全及其应用 部署服务器的初始化步骤: 1、配置IP地址,网关,DNS解析 2、安装源,外网(在线即可yum) 内网(只能用源码包编译安装) 3、磁盘分区 lvm raid 4、系统权限配置和基础安…