0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

韋東山freeRTOS系列教程之同步互斥與通信(4)

嵌入式Linux那些事 ? 2021-12-13 14:31 ? 次閱讀

文章目錄

  • 系列教程總目錄
  • 概述
  • 4.1 同步與互斥的概念
  • 4.2 同步與互斥并不簡單
  • 4.3 各類方法的對比

需要獲取更好閱讀體驗(yàn)的同學(xué),請?jiān)L問我專門設(shè)立的站點(diǎn)查看,地址:http://rtos.100ask.net/

系列教程總目錄

本教程連載中,篇章會比較多,為方便同學(xué)們閱讀,點(diǎn)擊這里可以查看文章的 目錄列表,目錄列表頁面地址:https://blog.csdn.net/thisway_diy/article/details/121399484

概述

本章是概述性的內(nèi)容??梢园讯嗳蝿?wù)系統(tǒng)當(dāng)做一個(gè)團(tuán)隊(duì),里面的每一個(gè)任務(wù)就相當(dāng)于團(tuán)隊(duì)里的一個(gè)人。團(tuán)隊(duì)成員之間要協(xié)調(diào)工作進(jìn)度(同步)、爭用會議室(互斥)、溝通(通信)。多任務(wù)系統(tǒng)中所涉及的概念,都可以在現(xiàn)實(shí)生活中找到例子。

各類RTOS都會涉及這些概念:任務(wù)通知(task notification)、隊(duì)列(queue)、事件組(event group)、信號量(semaphoe)、互斥量(mutex)等。我們先站在更高角度來講解這些概念。

4.1 同步與互斥的概念

一句話理解同步與互斥:我等你用完廁所,我再用廁所

  • 什么叫同步?就是:哎哎哎,我正在用廁所,你等會。
  • 什么叫互斥?就是:哎哎哎,我正在用廁所,你不能進(jìn)來。

同步與互斥經(jīng)常放在一起講,是因?yàn)樗鼈冎年P(guān)系很大,“互斥”操作可以使用“同步”來實(shí)現(xiàn)。我“等”你用完廁所,我再用廁所。這不就是用“同步”來實(shí)現(xiàn)“互斥”嗎?

再舉一個(gè)例子。在團(tuán)隊(duì)活動里,同事A先寫完報(bào)表,經(jīng)理B才能拿去向領(lǐng)導(dǎo)匯報(bào)。經(jīng)理B必須等同事A完成報(bào)表,AB之間有依賴,B必須放慢腳步,被稱為同步。在團(tuán)隊(duì)活動中,同事A已經(jīng)使用會議室了,經(jīng)理B也想使用,即使經(jīng)理B是領(lǐng)導(dǎo),他也得等著,這就叫互斥。經(jīng)理B跟同事A說:你用完會議室就提醒我。這就是使用"同步"來實(shí)現(xiàn)"互斥"。

有時(shí)候看代碼更容易理解,偽代碼如下:

01 void  搶廁所(void)
02 {
03    if (有人在用) 我瞇一會;
04    用廁所;
05    喂,醒醒,有人要用廁所嗎;
06 }

假設(shè)有A、B兩人早起搶廁所,A先行一步占用了;B慢了一步,于是就瞇一會;當(dāng)A用完后叫醒B,B也就愉快地上廁所了。
在這個(gè)過程中,A、B是互斥地訪問“廁所”,“廁所”被稱之為臨界資源。我們使用了“休眠-喚醒”的同步機(jī)制實(shí)現(xiàn)了“臨界資源”的“互斥訪問”。

同一時(shí)間只能有一個(gè)人使用的資源,被稱為臨界資源。比如任務(wù)A、B都要使用串口來打印,串口就是臨界資源。如果A、B同時(shí)使用串口,那么打印出來的信息就是A、B混雜,無法分辨。所以使用串口時(shí),應(yīng)該是這樣:A用完,B再用;B用完,A再用。

4.2 同步與互斥并不簡單

4.3 各類方法的對比

能實(shí)現(xiàn)同步、互斥的內(nèi)核方法有:任務(wù)通知(task notification)、隊(duì)列(queue)、事件組(event group)、信號量(semaphoe)、互斥量(mutex)。

它們都有類似的操作方法:獲取/釋放、阻塞/喚醒、超時(shí)。比如:

  • A獲取資源,用完后A釋放資源
  • A獲取不到資源則阻塞,B釋放資源并把A喚醒
  • A獲取不到資源則阻塞,并定個(gè)鬧鐘;A要么超時(shí)返回,要么在這段時(shí)間內(nèi)因?yàn)锽釋放資源而被喚醒。

這些內(nèi)核對象五花八門,記不住怎么辦?我也記不住,通過對比的方法來區(qū)分它們。

  • 能否傳信息?只能傳遞狀態(tài)?
  • 為眾生?只為你?
  • 我生產(chǎn),你們消費(fèi)?
  • 我上鎖,只能由我開鎖
內(nèi)核對象 生產(chǎn)者 消費(fèi)者 數(shù)據(jù)/狀態(tài) 說明
隊(duì)列 ALL ALL 數(shù)據(jù):若干個(gè)數(shù)據(jù)
誰都可以往隊(duì)列里扔數(shù)據(jù),
誰都可以從隊(duì)列里讀數(shù)據(jù)
用來傳遞數(shù)據(jù),
發(fā)送者、接收者無限制,
一個(gè)數(shù)據(jù)只能喚醒一個(gè)接收者
事件組 ALL ALL 多個(gè)位:或、與
誰都可以設(shè)置(生產(chǎn))多個(gè)位,
誰都可以等待某個(gè)位、若干個(gè)位
用來傳遞事件,
可以是N個(gè)事件,
發(fā)送者、接受者無限制,
可以喚醒多個(gè)接收者:像廣播
信號量 ALL ALL 數(shù)量:0~n
誰都可以增加一個(gè)數(shù)量,
誰都可消耗一個(gè)數(shù)量
用來維持資源的個(gè)數(shù),
生產(chǎn)者、消費(fèi)者無限制,
1個(gè)資源只能喚醒1個(gè)接收者
任務(wù)通知 ALL 只有我 數(shù)據(jù)、狀態(tài)都可以傳輸,
使用任務(wù)通知時(shí),
必須指定接受者
N對1的關(guān)系:
發(fā)送者無限制,
接收者只能是這個(gè)任務(wù)
互斥量 只能A開鎖 A上鎖 位:0、1
我上鎖:1變?yōu)?,
只能由我開鎖:0變?yōu)?
就像一個(gè)空廁所,
誰使用誰上鎖,
也只能由他開鎖

使用圖形對比如下:

  • 隊(duì)列:
    • 里面可以放任意數(shù)據(jù),可以放多個(gè)數(shù)據(jù)
    • 任務(wù)、ISR都可以放入數(shù)據(jù);任務(wù)、ISR都可以從中讀出數(shù)據(jù)
  • 事件組:
    • 一個(gè)事件用一bit表示,1表示事件發(fā)生了,0表示事件沒發(fā)生
    • 可以用來表示事件、事件的組合發(fā)生了,不能傳遞數(shù)據(jù)
    • 有廣播效果:事件或事件的組合發(fā)生了,等待它的多個(gè)任務(wù)都會被喚醒
  • 信號量:
    • 核心是"計(jì)數(shù)值"
    • 任務(wù)、ISR釋放信號量時(shí)讓計(jì)數(shù)值加1
    • 任務(wù)、ISR獲得信號量時(shí),讓計(jì)數(shù)值減1
  • 任務(wù)通知:
    • 核心是任務(wù)的TCB里的數(shù)值
    • 會被覆蓋
    • 發(fā)通知給誰?必須指定接收任務(wù)
    • 只能由接收任務(wù)本身獲取該通知
  • 互斥量:
    • 數(shù)值只有0或1
    • 誰獲得互斥量,就必須由誰釋放同一個(gè)互斥量
在這里插入圖片描述
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    5880

    瀏覽量

    135323
  • RTOS
    +關(guān)注

    關(guān)注

    20

    文章

    804

    瀏覽量

    119117
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61729
收藏 人收藏

    評論

    相關(guān)推薦

    東山freeRTOS系列程之信號量(6)

    文章目錄 系列教程總目錄 概述 6.1 信號量的特性 6.1.1 信號量的常規(guī)操作 6.1.2 信號量跟隊(duì)列的對比 6.1.3 兩種信號量的對比 6.2 信號量函數(shù) 6.2.1 創(chuàng)建 6.2.2
    的頭像 發(fā)表于 12-13 14:35 ?4908次閱讀
    <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系列程之隊(duì)列(queue)(5)

    文章目錄 系列教程總目錄 概述 5.1 隊(duì)列的特性 5.1.1 常規(guī)操作 5.1.2 傳輸數(shù)據(jù)的兩種方法 5.1.3 隊(duì)列的阻塞訪問 5.2 隊(duì)列函數(shù) 5.2.1 創(chuàng)建 5.2.2 復(fù)位 5.2.3
    的頭像 發(fā)表于 12-13 14:33 ?5680次閱讀
    <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>隊(duì)列(queue)(5)

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

    文章目錄 系列教程總目錄 概述 7.1 互斥量的使用場合 7.2 互斥量函數(shù) 7.2.1 創(chuàng)建 7.2.2 其他函數(shù) 7.3 示例15: 互斥量基本使用 7.4 示例16: 誰上鎖就由
    的頭像 發(fā)表于 12-13 14:38 ?7552次閱讀
    <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系統(tǒng)—隊(duì)列

    FreeRTOS中,隊(duì)列是實(shí)現(xiàn)任務(wù)之間同步互斥通信的一種重要方法(其他的實(shí)現(xiàn)方法有:任務(wù)通知、事件組、信號量、互斥量)。
    的頭像 發(fā)表于 11-10 11:37 ?979次閱讀
    基于<b class='flag-5'>FreeRTOS</b>的STM32F103系統(tǒng)—隊(duì)列

    東山linux視頻

    東山linux視頻主要內(nèi)容包括:uboot、裸機(jī)、文件系統(tǒng)、驅(qū)動初步,又需要的可以下載看看東山的視頻還是很不錯(cuò)的,可惜沒有找到后兩期的?!菊怼?b class='flag-5'>
    發(fā)表于 12-21 23:49

    轉(zhuǎn):第23章 FreeRTOS互斥信號量

    FreeRTOS互斥信號量的源碼實(shí)現(xiàn)是基于消息隊(duì)列實(shí)現(xiàn)的。本章教程配套的例子含Cortex-M3內(nèi)核的STM32F103和Cortex-M4內(nèi)核的STM32F407以及F429。23.1
    發(fā)表于 09-06 14:58

    多線程同步互斥有幾種實(shí)現(xiàn)方法

    線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒有得到另一個(gè)線程的消息時(shí)應(yīng)等待,直到消息到達(dá)時(shí)才被喚醒。線程互斥是指對于共享的進(jìn)程系統(tǒng)資源,在各單個(gè)線程訪問時(shí)的排
    發(fā)表于 08-05 06:06

    同步互斥通信相關(guān)資料下載

    慕課電子科技大學(xué).嵌入式系統(tǒng).第八章.同步互斥通信.異步信號和管道0 目錄8 同步互斥通信8
    發(fā)表于 12-22 06:37

    東山freeRTOS系列教程:入門文檔教程+進(jìn)階視頻教程

    文章目錄 學(xué)前知識普及 初級文檔教程 進(jìn)階視頻教程 進(jìn)階一:FreeRTOS的內(nèi)部機(jī)制 進(jìn)階二:深入理解FreeRTOS隊(duì)列之隊(duì)列實(shí)戰(zhàn) 進(jìn)階三:RTOS商業(yè)產(chǎn)品案例源碼講解 學(xué)前知識普及 對于
    發(fā)表于 11-29 16:36 ?2110次閱讀
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b><b class='flag-5'>freeRTOS</b><b class='flag-5'>系列</b>教程:入門文檔教程+進(jìn)階視頻教程

    東山freeRTOS程之FreeRTOS概述與體驗(yàn)(1)

    文章目錄 教程目錄 1.1 FreeRTOS目錄結(jié)構(gòu) 1.1 FreeRTOS目錄結(jié)構(gòu) 1.2 核心文件 1.3 移植時(shí)涉及的文件 1.4 頭文件相關(guān) 1.4.1 頭文件目錄 1.4.2 頭文件
    發(fā)表于 11-29 16:56 ?1871次閱讀
    <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>概述與體驗(yàn)(1)

    東山freeRTOS系列程之內(nèi)存管理(2)

    文章目錄 教程目錄 2.1 為什么要自己實(shí)現(xiàn)內(nèi)存管理 2.2 FreeRTOS的5種內(nèi)存管理方法 2.2.1 Heap_1 2.2.2 Heap_2 2.2.3 Heap_3 2.2.4
    發(fā)表于 11-29 16:58 ?939次閱讀
    <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>內(nèi)存管理(2)

    東山freeRTOS系列程之任務(wù)管理(3)

    文章目錄 系列教程總目錄 概述 3.1 基本概念 3.2 任務(wù)創(chuàng)建與刪除 3.2.1 什么是任務(wù) 3.2.2 創(chuàng)建任務(wù) 3.2.3 示例1: 創(chuàng)建任務(wù) 3.2.4 示例2: 使用任務(wù)參數(shù) 3.2.5
    發(fā)表于 11-29 17:00 ?1011次閱讀
    <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>任務(wù)管理(3)

    東山嵌入式Linux學(xué)習(xí)——012 按鍵中斷

    東山嵌入式Linux學(xué)習(xí)——012 按鍵中斷
    發(fā)表于 12-04 17:36 ?10次下載
    <b class='flag-5'>韋</b><b class='flag-5'>東山</b>嵌入式Linux學(xué)習(xí)——012 按鍵中斷

    FreeRTOS 隊(duì)列 信號量 互斥

    文章目錄前言Queue 隊(duì)列semaphore 信號量Mutex 互斥量微信公眾號前言FreeRTOS STM32CubeMX配置 內(nèi)存管理 任務(wù)管理上節(jié)介紹了用STM32CubeMX生成帶
    發(fā)表于 12-09 09:51 ?0次下載
    <b class='flag-5'>FreeRTOS</b> 隊(duì)列 信號量 <b class='flag-5'>互斥</b>量

    FreeRTOS的二值信號量

    FreeRTOS中的信號量是一種任務(wù)間通信的方式,信號量包括:二值信號量、互斥信號量、計(jì)數(shù)信號量,本次實(shí)驗(yàn)只使用二值信號量。信號量用于任務(wù)間的同步,
    的頭像 發(fā)表于 02-10 15:07 ?1247次閱讀