文章目錄
- 系列教程總目錄
- 概述
- 4.1 同步與互斥的概念
- 4.2 同步與互斥并不簡(jiǎn)單
- 4.3 各類方法的對(duì)比
需要獲取更好閱讀體驗(yàn)的同學(xué),請(qǐng)?jiān)L問我專門設(shè)立的站點(diǎn)查看,地址:http://rtos.100ask.net/
系列教程總目錄
本教程連載中,篇章會(huì)比較多,為方便同學(xué)們閱讀,點(diǎn)擊這里可以查看文章的 目錄列表,目錄列表頁(yè)面地址: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)度(同步)、爭(zhēng)用會(huì)議室(互斥)、溝通(通信)。多任務(wù)系統(tǒng)中所涉及的概念,都可以在現(xiàn)實(shí)生活中找到例子。
各類RTOS都會(huì)涉及這些概念:任務(wù)通知(task notification)、隊(duì)列(queue)、事件組(event group)、信號(hào)量(semaphoe)、互斥量(mutex)等。我們先站在更高角度來講解這些概念。
4.1 同步與互斥的概念
一句話理解同步與互斥:我等你用完廁所,我再用廁所。
- 什么叫同步?就是:哎哎哎,我正在用廁所,你等會(huì)。
- 什么叫互斥?就是:哎哎哎,我正在用廁所,你不能進(jìn)來。
同步與互斥經(jīng)常放在一起講,是因?yàn)樗鼈冎年P(guān)系很大,“互斥”操作可以使用“同步”來實(shí)現(xiàn)。我“等”你用完廁所,我再用廁所。這不就是用“同步”來實(shí)現(xiàn)“互斥”嗎?
再舉一個(gè)例子。在團(tuán)隊(duì)活動(dòng)里,同事A先寫完報(bào)表,經(jīng)理B才能拿去向領(lǐng)導(dǎo)匯報(bào)。經(jīng)理B必須等同事A完成報(bào)表,AB之間有依賴,B必須放慢腳步,被稱為同步。在團(tuán)隊(duì)活動(dòng)中,同事A已經(jīng)使用會(huì)議室了,經(jīng)理B也想使用,即使經(jīng)理B是領(lǐng)導(dǎo),他也得等著,這就叫互斥。經(jīng)理B跟同事A說:你用完會(huì)議室就提醒我。這就是使用"同步"來實(shí)現(xiàn)"互斥"。
有時(shí)候看代碼更容易理解,偽代碼如下:
01 void 搶廁所(void)
02 {
03 if (有人在用) 我瞇一會(huì);
04 用廁所;
05 喂,醒醒,有人要用廁所嗎;
06 }
假設(shè)有A、B兩人早起搶廁所,A先行一步占用了;B慢了一步,于是就瞇一會(huì);當(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 同步與互斥并不簡(jiǎn)單
4.3 各類方法的對(duì)比
能實(shí)現(xiàn)同步、互斥的內(nèi)核方法有:任務(wù)通知(task notification)、隊(duì)列(queue)、事件組(event group)、信號(hào)量(semaphoe)、互斥量(mutex)。
它們都有類似的操作方法:獲取/釋放、阻塞/喚醒、超時(shí)。比如:
- A獲取資源,用完后A釋放資源
- A獲取不到資源則阻塞,B釋放資源并把A喚醒
- A獲取不到資源則阻塞,并定個(gè)鬧鐘;A要么超時(shí)返回,要么在這段時(shí)間內(nèi)因?yàn)锽釋放資源而被喚醒。
這些內(nèi)核對(duì)象五花八門,記不住怎么辦?我也記不住,通過對(duì)比的方法來區(qū)分它們。
- 能否傳信息?只能傳遞狀態(tài)?
- 為眾生?只為你?
- 我生產(chǎn),你們消費(fèi)?
- 我上鎖,只能由我開鎖
內(nèi)核對(duì)象 | 生產(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è)接收者:像廣播 |
信號(hào)量 | 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對(duì)1的關(guān)系: 發(fā)送者無限制, 接收者只能是這個(gè)任務(wù) |
互斥量 | 只能A開鎖 | A上鎖 |
位:0、1 我上鎖:1變?yōu)?, 只能由我開鎖:0變?yōu)? |
就像一個(gè)空廁所, 誰使用誰上鎖, 也只能由他開鎖 |
使用圖形對(duì)比如下:
-
隊(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ù)都會(huì)被喚醒
-
信號(hào)量:
- 核心是"計(jì)數(shù)值"
- 任務(wù)、ISR釋放信號(hào)量時(shí)讓計(jì)數(shù)值加1
- 任務(wù)、ISR獲得信號(hào)量時(shí),讓計(jì)數(shù)值減1
-
任務(wù)通知:
- 核心是任務(wù)的TCB里的數(shù)值
- 會(huì)被覆蓋
- 發(fā)通知給誰?必須指定接收任務(wù)
- 只能由接收任務(wù)本身獲取該通知
-
互斥量:
- 數(shù)值只有0或1
- 誰獲得互斥量,就必須由誰釋放同一個(gè)互斥量
-
通信
+關(guān)注
關(guān)注
18文章
6032瀏覽量
135999 -
RTOS
+關(guān)注
關(guān)注
22文章
813瀏覽量
119650 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62182
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論