FreeRTOS通信總結(jié)
功能及區(qū)別:
消息隊列:在任務(wù)與任務(wù)間、 中斷和任務(wù)間傳遞信息,可以數(shù)據(jù)傳輸
(需要傳遞消息時使用)
事件標志組:實現(xiàn)任務(wù)與任務(wù)間、 中斷和任務(wù)間的同步,無數(shù)據(jù)傳輸。
????可實現(xiàn)一對多、多對多的同步, 可選擇是 “ 邏輯或 ” 觸發(fā)還 是 “ 邏輯與 ”觸發(fā)。
????即 一 個任務(wù)可以等待多個事件的發(fā)生。
?(多個事件同步,不需要傳遞消息時使用)
信號量:(單個事件同步,不需要傳遞消息時使用)
#二值信號量:類似一個標志位。僅”空“(0)和”非空“(1)兩種狀態(tài)
#計數(shù)信號量:用來事件計數(shù)和資源管理
#互斥信號量:擁有優(yōu)先級繼承的二值信號量(中斷中無法使用)
任務(wù)通知:可以在一定場合下替代信號量, 隊列、事件組等。
消息隊列
????通過消息隊列服務(wù),任務(wù)或中斷服務(wù)例程可以將一條或多條消息放入消息隊列中。
????同樣,一個或多個任務(wù)可以從消息隊列中獲得消息。當(dāng)有多個消息發(fā)送到消息隊列時,通常是將先進入消息隊列的消息先傳給任務(wù),也就是說,任務(wù)先得到的是最先進入消息隊列的消息,即先進先出原則(FIFO),但是也支持后進先出原則。(可以在任務(wù)和中斷中使用)
消息支持先進先出方式排隊,支持異步讀寫工作方式。
讀寫隊列均支持超時機制。
消息支持后進先出方式排隊,往隊首發(fā)送消息(LIFO)。
可以允許不同長度(不超過隊列節(jié)點最大值)的任意類型消息。
一個任務(wù)能夠從任意一個消息隊列接收和發(fā)送消息。
多個任務(wù)能夠從同一個消息隊列接收和發(fā)送消息。
當(dāng)隊列使用結(jié)束后,可以通過刪除隊列函數(shù)進行刪除。
?事件標志組
????事件是一種實現(xiàn)任務(wù)間通信的機制,主要用于實現(xiàn)多任務(wù)間的同步,但事件通信只能是事件類型的通信,無數(shù)據(jù)傳輸。
????與信號量不同的是,它可以實現(xiàn)一對多,多對多的同步。 即一個任務(wù)可以等待多個事件的發(fā)生:可以是任意一個事件發(fā)生時喚醒任務(wù)進行事件處理;也可以是幾個事件都發(fā)生后才喚醒任務(wù)進行事件處理。同樣,也可以是多個任務(wù)同步多個事件。(可以在任務(wù)和中斷中使用)
事件只與任務(wù)相關(guān)聯(lián),事件相互獨立,一個 32 位的事件集合(EventBits_t 類型的變量,實際可用與表示事件的只有 24位),用于標識該任務(wù)發(fā)生的事件類型,其中每一位表示一種事件類型(0 表示該事件類型未發(fā)生、1 表示該事件類型已經(jīng)發(fā)生),一共 24 種事件類型。
事件僅用于同步,不提供數(shù)據(jù)傳輸功能。
事件無排隊性,即多次向任務(wù)設(shè)置同一事件(如果任務(wù)還未來得及讀走),等效于 只設(shè)置一次。
允許多個任務(wù)對同一事件進行讀寫操作。
支持事件等待超時機制。
信號量?
????兩個任務(wù)之間或者中斷函數(shù)跟任務(wù)之間的同步功能,這個與事件標志組是類似的。其實就是共享資源為 1 的時候。
????多個共享資源的管理。正在使用的資源有多少,信號量就減多少。
二值信號量(可以在任務(wù)和中斷中使用)
????信號量資源被獲取了,信號量值就是 0,信號量資源被釋放,信號量值就是 1,把這種只有 0 和 1 兩種情況的信號量稱之為二值信號量。
????類似一個標志位,事件產(chǎn)生置1,事件處理后置0。
計數(shù)信號量(可以在任務(wù)和中斷中使用)
????優(yōu)先級翻轉(zhuǎn):在很多場合中,某些資源只有一個,當(dāng)?shù)蛢?yōu)先級任務(wù)正在占用該資源的時候,即便高優(yōu)先級任務(wù)也只能乖乖的等待低優(yōu)先級任務(wù)使用完該資源后釋放資源。這里高優(yōu)先級任務(wù)無法運行而低優(yōu)先級任務(wù)可以運行的現(xiàn)象稱為“優(yōu)先級翻轉(zhuǎn)”。
????事件計數(shù):事件產(chǎn)生--釋放信號量(信號量+1),事件處理--獲取信號量(信號量-1),減到零表示所有事件處理完畢
????資源管理:信號量值代表當(dāng)前資源的可用數(shù)量,比如停車場當(dāng)前剩余的停車位數(shù)量。信號量值為 0 時說明沒有資源了
互斥信號量(可以在任務(wù)中使用,不可以在中斷中使用)
????互斥信號量其實就是一個擁有優(yōu)先級繼承的二值信號量,在同步的應(yīng)用中(任務(wù)與任務(wù)或中斷與任務(wù)之間的同步)二值信號量最適合。
????互斥信號量不能用于中斷服務(wù)函數(shù)中, 原因如下:
????1.互斥信號量有優(yōu)先級繼承的機制,所以只能用在任務(wù)中,不能用于中斷服務(wù)函數(shù)。
????2.中斷服務(wù)函數(shù)中不能因為要等待互斥信號量而設(shè)置阻塞時間進入阻塞態(tài)。
?任務(wù)通知?
????通過任務(wù)通知方式可以實現(xiàn)計數(shù)信號量,二值信號量,事件標志組和消息郵箱(消息郵箱就是消息隊列長度為 1 的情況)。
????在使用隊列、信號量前,必須先創(chuàng)建隊列和信號量,目的是為了創(chuàng)建隊列數(shù)據(jù)結(jié)構(gòu)。而由于任務(wù)通知的數(shù)據(jù)結(jié)構(gòu)包含在任務(wù)控制塊中,只要任務(wù)存在,任務(wù)通知數(shù)據(jù)結(jié)構(gòu)就已經(jīng)創(chuàng)建完畢,可以直接使用。
????任務(wù)通知可以在任務(wù)中向指定任務(wù)發(fā)送通知,也可以在中斷中向指定任務(wù)發(fā)送通知,F(xiàn)reeRTOS 的每個任務(wù)都有一個 32 位的通知值,任務(wù)控制塊中的成員變量 ulNotifiedValue 就是這個通知值。
????只有在任務(wù)中可以等待通知,而不允許在中斷中等待通知。
????處理更快,RAM 開銷更小。
????限制:
1、任務(wù)通知方式僅可以用在只有一個任務(wù)等待信號量,消息郵箱或者事件標志組的情況。
2、使用任務(wù)通知方式實現(xiàn)的消息郵箱替代消息隊列時,發(fā)送消息的任務(wù)不支持超時等待,即消息隊列中的數(shù)據(jù)已經(jīng)滿了,可以等待消息隊列有空間可以存新的數(shù)據(jù),而任務(wù)通知方式實現(xiàn)的消息郵箱不支持超時等待。
FreeRTOS 提供以下幾種方式發(fā)送通知給任務(wù) :
????發(fā)送通知給任務(wù), 如果有通知未讀,不覆蓋通知值。
????發(fā)送通知給任務(wù),直接覆蓋通知值。
????發(fā)送通知給任務(wù),設(shè)置通知值的一個或者多個位 ,可以當(dāng)做事件組來使用。
????發(fā)送通知給任務(wù),遞增通知值,可以當(dāng)做計數(shù)信號量使用。
轉(zhuǎn)載自:FreeRTOS消息隊列、信號量、事件標志組、任務(wù)通知_丨匿名用戶丨的博客