文章目錄
- 系列教程總目錄
- 概述
- 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文章
5977瀏覽量
135872 -
RTOS
+關注
關注
22文章
809瀏覽量
119454 -
FreeRTOS
+關注
關注
12文章
483瀏覽量
62019
發布評論請先 登錄
相關推薦
評論