0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

韦东山freeRTOS系列教程之同步互斥与通信(4)

嵌入式Linux那些事 2021-12-13 14:31 次阅读

文章目录

  • 系列教程总目录
  • 概述
  • 4.1 同步与互斥的概念
  • 4.2 同步与互斥并不简单
  • 4.3 各类方法的对比

需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/

系列教程总目录

本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的 目录列表,目录列表页面地址:https://blog.csdn.net/thisway_diy/article/details/121399484

概述

本章是概述性的内容。可以把多任务系统当做一个团队,里面的每一个任务就相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统中所涉及的概念,都可以在现实生活中找到例子。

各类RTOS都会涉及这些概念:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。我们先站在更高角度来讲解这些概念。

4.1 同步与互斥的概念

一句话理解同步与互斥:我等你用完厕所,我再用厕所

  • 什么叫同步?就是:哎哎哎,我正在用厕所,你等会。
  • 什么叫互斥?就是:哎哎哎,我正在用厕所,你不能进来。

同步与互斥经常放在一起讲,是因为它们之的关系很大,“互斥”操作可以使用“同步”来实现。我“等”你用完厕所,我再用厕所。这不就是用“同步”来实现“互斥”吗?

再举一个例子。在团队活动里,同事A先写完报表,经理B才能拿去向领导汇报。经理B必须等同事A完成报表,AB之间有依赖,B必须放慢脚步,被称为同步。在团队活动中,同事A已经使用会议室了,经理B也想使用,即使经理B是领导,他也得等着,这就叫互斥。经理B跟同事A说:你用完会议室就提醒我。这就是使用"同步"来实现"互斥"。

有时候看代码更容易理解,伪代码如下:

01 void  抢厕所(void)
02 {
03    if (有人在用) 我眯一会;
04    用厕所;
05    喂,醒醒,有人要用厕所吗;
06 }

假设有A、B两人早起抢厕所,A先行一步占用了;B慢了一步,于是就眯一会;当A用完后叫醒B,B也就愉快地上厕所了。
在这个过程中,A、B是互斥地访问“厕所”,“厕所”被称之为临界资源。我们使用了“休眠-唤醒”的同步机制实现了“临界资源”的“互斥访问”。

同一时间只能有一个人使用的资源,被称为临界资源。比如任务A、B都要使用串口来打印,串口就是临界资源。如果A、B同时使用串口,那么打印出来的信息就是A、B混杂,无法分辨。所以使用串口时,应该是这样:A用完,B再用;B用完,A再用。

4.2 同步与互斥并不简单

4.3 各类方法的对比

能实现同步、互斥的内核方法有:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)。

它们都有类似的操作方法:获取/释放、阻塞/唤醒、超时。比如:

  • A获取资源,用完后A释放资源
  • A获取不到资源则阻塞,B释放资源并把A唤醒
  • A获取不到资源则阻塞,并定个闹钟;A要么超时返回,要么在这段时间内因为B释放资源而被唤醒。

这些内核对象五花八门,记不住怎么办?我也记不住,通过对比的方法来区分它们。

  • 能否传信息?只能传递状态?
  • 为众生?只为你?
  • 我生产,你们消费?
  • 我上锁,只能由我开锁
内核对象 生产者 消费者 数据/状态 说明
队列 ALL ALL 数据:若干个数据
谁都可以往队列里扔数据,
谁都可以从队列里读数据
用来传递数据,
发送者、接收者无限制,
一个数据只能唤醒一个接收者
事件组 ALL ALL 多个位:或、与
谁都可以设置(生产)多个位,
谁都可以等待某个位、若干个位
用来传递事件,
可以是N个事件,
发送者、接受者无限制,
可以唤醒多个接收者:像广播
信号量 ALL ALL 数量:0~n
谁都可以增加一个数量,
谁都可消耗一个数量
用来维持资源的个数,
生产者、消费者无限制,
1个资源只能唤醒1个接收者
任务通知 ALL 只有我 数据、状态都可以传输,
使用任务通知时,
必须指定接受者
N对1的关系:
发送者无限制,
接收者只能是这个任务
互斥量 只能A开锁 A上锁 位:0、1
我上锁:1变为0,
只能由我开锁:0变为1
就像一个空厕所,
谁使用谁上锁,
也只能由他开锁

使用图形对比如下:

  • 队列:
    • 里面可以放任意数据,可以放多个数据
    • 任务、ISR都可以放入数据;任务、ISR都可以从中读出数据
  • 事件组:
    • 一个事件用一bit表示,1表示事件发生了,0表示事件没发生
    • 可以用来表示事件、事件的组合发生了,不能传递数据
    • 有广播效果:事件或事件的组合发生了,等待它的多个任务都会被唤醒
  • 信号量:
    • 核心是"计数值"
    • 任务、ISR释放信号量时让计数值加1
    • 任务、ISR获得信号量时,让计数值减1
  • 任务通知:
    • 核心是任务的TCB里的数值
    • 会被覆盖
    • 发通知给谁?必须指定接收任务
    • 只能由接收任务本身获取该通知
  • 互斥量:
    • 数值只有0或1
    • 谁获得互斥量,就必须由谁释放同一个互斥量
在这里插入图片描述
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    5693

    浏览量

    134270
  • RTOS
    +关注

    关注

    20

    文章

    773

    浏览量

    118748
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61334
收藏 人收藏

    评论

    相关推荐

    东山freeRTOS系列程之信号量(6)

    文章目录 系列教程总目录 概述 6.1 信号量的特性 6.1.1 信号量的常规操作 6.1.2 信号量跟队列的对比 6.1.3 两种信号量的对比 6.2 信号量函数 6.2.1 创建 6.2.2
    的头像 发表于 12-13 14:35 4680次阅读
    韦<b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>信号量(6)

    东山freeRTOS系列程之互斥量(mutex)(7)

    文章目录 系列教程总目录 概述 7.1 互斥量的使用场合 7.2 互斥量函数 7.2.1 创建 7.2.2 其他函数 7.3 示例15: 互斥量基本使用 7.4 示例16: 谁上锁就由
    的头像 发表于 12-13 14:38 7251次阅读
    韦<b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b><b class='flag-5'>互斥</b>量(mutex)(7)

    基于FreeRTOS的STM32F103系统—队列

    FreeRTOS中,队列是实现任务之间同步互斥通信的一种重要方法(其他的实现方法有:任务通知、事件组、信号量、互斥量)。
    的头像 发表于 11-10 11:37 646次阅读
    基于<b class='flag-5'>FreeRTOS</b>的STM32F103系统—队列

    FreeRTOS信号量的使用与实例

    在嵌入式系统中,任务管理是一个重要的部分,它涉及到任务之间的通信同步,信号量,队列,互斥锁和事件标志组等概念。本文将以 FreeRTOS 为例,详细讲解这些内容。
    的头像 发表于 12-12 15:25 601次阅读

    东山linux视频

    东山linux视频主要内容包括:uboot、裸机、文件系统、驱动初步,又需要的可以下载看看东山的视频还是很不错的,可惜没有找到后两期的。【整理】
    发表于 12-21 23:49

    转:第23章 FreeRTOS互斥信号量

    FreeRTOS互斥信号量的源码实现是基于消息队列实现的。本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。23.1
    发表于 09-06 14:58

    多线程同步互斥有几种实现方法

    线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排
    发表于 08-05 06:06

    进程的互斥同步介绍

      程之间互相竞争某一个资源,这种关系就称为进程的互斥,也就是说对于某个系统资源,如果一个进程正在使用,其他的进程就必须等待其用完,不能同时使用。
    发表于 08-06 08:28

    同步互斥通信相关资料下载

    慕课电子科技大学.嵌入式系统.第八章.同步互斥通信.异步信号和管道0 目录8 同步互斥通信8
    发表于 12-22 06:37

    东山freeRTOS程之FreeRTOS概述与体验(1)

    文章目录 教程目录 1.1 FreeRTOS目录结构 1.1 FreeRTOS目录结构 1.2 核心文件 1.3 移植时涉及的文件 1.4 头文件相关 1.4.1 头文件目录 1.4.2 头文件
    发表于 11-29 16:56 1635次阅读
    韦<b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b>教<b class='flag-5'>程之</b><b class='flag-5'>FreeRTOS</b>概述与体验(1)

    FreeRTOS信号量 & ESP32实战

    FreeRTOS信号量 & ESP32实战阅读建议:有一定操作系统基础知识。FreeRTOS信号量1. 二值信号量  二值信号量通常用于互斥访问或同步,二值信号量和
    发表于 12-03 18:06 1次下载
    <b class='flag-5'>FreeRTOS</b>信号量 & ESP32实战

    FreeRTOS 队列 信号量 互斥

    文章目录前言Queue 队列semaphore 信号量Mutex 互斥量微信公众号前言FreeRTOS STM32CubeMX配置 内存管理 任务管理上节介绍了用STM32CubeMX生成
    发表于 12-09 09:51 0次下载
    <b class='flag-5'>FreeRTOS</b> 队列 信号量 <b class='flag-5'>互斥</b>量

    FreeRTOS系列第20篇---FreeRTOS信号量API函数

    FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互...
    发表于 01-26 17:44 4次下载
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>系列</b>第20篇---<b class='flag-5'>FreeRTOS</b>信号量API函数

    使用Arduino在FreeRTOS中实现信号量和互斥量的方式

    信号量和互斥互斥)是用于同步、资源管理和保护资源免受损坏的内核对象。在本教程的前半部分,我们将了解Semaphore背后的理念,以及如何以及在何处使用它。
    的头像 发表于 08-16 15:34 1861次阅读
    使用Arduino在<b class='flag-5'>FreeRTOS</b>中实现信号量和<b class='flag-5'>互斥</b>量的方式

    FreeRTOS的二值信号量

    FreeRTOS中的信号量是一种任务间通信的方式,信号量包括:二值信号量、互斥信号量、计数信号量,本次实验只使用二值信号量。信号量用于任务间的同步
    的头像 发表于 02-10 15:07 916次阅读