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

    文章

    6314

    浏览量

    139538
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122572
  • FreeRTOS
    +关注

    关注

    14

    文章

    497

    浏览量

    66327
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    东山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 5944次阅读
    <b class='flag-5'>韦</b><b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>信号量(6)

    东山freeRTOS系列程之队列(queue)(5)

    文章目录 系列教程总目录 概述 5.1 队列的特性 5.1.1 常规操作 5.1.2 传输数据的两种方法 5.1.3 队列的阻塞访问 5.2 队列函数 5.2.1 创建 5.2.2 复位 5.2.3
    的头像 发表于 12-13 14:33 6644次阅读
    <b class='flag-5'>韦</b><b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>队列(queue)(5)

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

    文章目录 系列教程总目录 概述 7.1 互斥量的使用场合 7.2 互斥量函数 7.2.1 创建 7.2.2 其他函数 7.3 示例15: 互斥量基本使用 7.4 示例16: 谁上锁就由
    的头像 发表于 12-13 14:38 8520次阅读
    <b class='flag-5'>韦</b><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 1791次阅读
    基于<b class='flag-5'>FreeRTOS</b>的STM32F103系统—队列

    东山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

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

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

    东山freeRTOS系列教程:入门文档教程+进阶视频教程

    文章目录 学前知识普及 初级文档教程 进阶视频教程 进阶一:FreeRTOS的内部机制 进阶二:深入理解FreeRTOS队列之队列实战 进阶三:RTOS商业产品案例源码讲解 学前知识普及 对于
    发表于 11-29 16:36 3141次阅读
    <b class='flag-5'>韦</b><b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教程:入门文档教程+进阶视频教程

    东山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 2711次阅读
    <b class='flag-5'>韦</b><b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b>教<b class='flag-5'>程之</b><b class='flag-5'>FreeRTOS</b>概述与体验(1)

    东山freeRTOS系列程之内存管理(2)

    文章目录 教程目录 2.1 为什么要自己实现内存管理 2.2 FreeRTOS的5种内存管理方法 2.2.1 Heap_1 2.2.2 Heap_2 2.2.3 Heap_3 2.2.4
    发表于 11-29 16:58 1432次阅读
    <b class='flag-5'>韦</b><b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>内存管理(2)

    东山freeRTOS系列程之任务管理(3)

    文章目录 系列教程总目录 概述 3.1 基本概念 3.2 任务创建与删除 3.2.1 什么是任务 3.2.2 创建任务 3.2.3 示例1: 创建任务 3.2.4 示例2: 使用任务参数 3.2.5
    发表于 11-29 17:00 1563次阅读
    <b class='flag-5'>韦</b><b class='flag-5'>东山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教<b class='flag-5'>程之</b>任务管理(3)

    东山嵌入式Linux学习——012 按键中断

    东山嵌入式Linux学习——012 按键中断
    发表于 12-04 17:36 10次下载
    <b class='flag-5'>韦</b><b class='flag-5'>东山</b>嵌入式Linux学习——012 按键中断

    FreeRTOS 队列 信号量 互斥

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

    FreeRTOS的二值信号量

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