任務間通訊

2021-08-20 21:04:06 字數 3849 閱讀 1089

[另請參閱

阻止多個rtos物件

]佇列是任務間通訊的主要形式。

它們可以用來在任務之間以及中斷和任務之間傳送訊息。

在大多數情況下,它們被用作執行緒安全fifo(先入先出)緩衝區,新資料被傳送到佇列的後面,儘管資料也可以傳送到前端。

寫入和讀取佇列。

在這個例子中,佇列被建立為儲存5個專案,並且佇列永遠不會變滿。

freertos佇列使用模型設法將簡單性和靈活性結合在一起 - 通常是互斥的屬性。

訊息通過複製傳送到佇列中,這意味著資料(可以是指向較大緩衝區的指標)本身被複製到佇列中,而不是始終僅儲存對資料的引用的佇列。

這是最好的方法,因為:

該freertos的教程書

佇列api函式允許指定塊時間。

當任務嘗試從空佇列中讀取時,任務將被置於阻塞狀態(因此它不會消耗任何cpu時間並可以執行其他任務),直到資料在佇列中可用或者阻塞時間到期。

當任務嘗試寫入完整佇列時,任務將進入阻塞狀態(因此它不消耗任何cpu時間並可以執行其他任務),直到佇列中的任何空間變為可用或阻塞時間結束。

如果同一佇列中有多個任務塊,則具有最高優先順序的任務將成為首先解除阻塞的任務。

請參閱使用者文件

的佇列管理

部分以獲取與佇列相關的api函式列表。

搜尋freertos / demo / common / minimal

目錄中的檔案將顯示其使用情況的多個示例。

請注意,中斷不得使用不以「fromisr」結尾的api函式。

freertos二進位制訊號量

二進位制訊號用於互斥和同步目的。

二進位制訊號量和互斥量非常相似,但有一些細微差別:互斥量包括優先順序繼承機制,二進位制訊號量不包含。

這使得二進位制訊號量成為實現同步(任務之間或任務與中斷之間)的更好選擇,並且互斥實現簡單互斥的更好選擇。該描述

的互斥體是如何被用作乙個互斥機制的二進位制訊號也同樣成立。

本小節將只描述使用二進位制訊號進行同步。

訊號量api函式允許指定塊時間。

阻塞時間指示當訊號量不可立即可用時,任務在嘗試「採取」訊號量時應進入阻塞狀態的最大「節拍數」。

如果多個任務在同乙個訊號量上阻塞,那麼具有最高優先順序的任務將在下一次訊號量變為可用時解除阻塞。

將二進位制訊號量想象成只能容納乙個專案的佇列。

佇列因此只能是空的或全部的(因此是二進位制的)。

使用佇列的任務和中斷不關心佇列是什麼 - 他們只想知道佇列是空的還是滿的。

這種機制可以被利用來將任務與中斷同步(例如)。

考慮使用任務來為外設提供服務的情況。

輪詢外設會浪費cpu資源,並阻止執行其他任務。

因此,最好是任務大部分時間都處於阻塞狀態(允許其他任務執行),並且只有在實際有事情需要時才執行。

這是通過在嘗試「取」訊號量時使用任務block來使用二進位制訊號量來實現的。

然後為外設寫乙個中斷程式,當外設需要維修時,該程式只是「給」訊號量。

該任務總是'取得'訊號量(從佇列中讀取以使隊列為空),但從不'給出'它。

中斷總是'給''訊號量(寫入佇列使其滿),但從不接受它。

xsemaphoregivefromisr()

文件頁面應該使這個更清晰。

另請參閱

rtos任務通知

,在某些情況下可用作更快,更輕的二進位制訊號量替代品。

可以使用任務優先順序確保外圍裝置及時獲得服務 - 有效地生成「延遲中斷」方案。

(注意freertos也有乙個

內建的延遲中斷機制

)。另一種方法是使用佇列來代替訊號量。

完成此操作後,中斷例程可以捕獲與外設事件關聯的資料,並將其傳送到佇列中以傳送給任務。

當資料在佇列中可用時,該任務將取消阻塞,從佇列中檢索資料,然後執行所需的任何資料處理。

第二種方案允許中斷盡可能短,所有的後處理都在乙個任務中進行。

請參閱使用者文件

的semaphores / mutexes

部分以獲取訊號量相關的api函式列表。

搜尋freertos / demo / common / minimal

目錄中的檔案將顯示其使用情況的多個示例。

請注意,中斷不得使用不以「fromisr」結尾的api函式。

使用訊號量將任務與中斷同步。

只有中斷'給''訊號量,而任務只'取'訊號量。

freertos計數訊號量

任務通知」

都可以提供乙個輕量級選項來計算訊號量 

正如二進位制訊號量可以被認為是長度為

1的佇列一樣,計數訊號量可以被認為是長度大於

1的佇列。同樣,訊號量的使用者對儲存在佇列中的資料不感興趣

- 只是佇列是否為空。

計數訊號量通常用於兩件事情:

計數事件。

在這種使用場景中,事件處理程式會在每次發生事件(增加訊號量計數值)時「給

」乙個訊號量,並且每次處理事件(遞減訊號量計數值)時,處理程式任務都會「採取

」乙個訊號量。因此,計數值是發生的事件數量與已處理的數量之間的差值。在這種情況下,當訊號量被建立時,計數值最好為零。

資源管理。

在這種使用情況下,計數值表示可用資源的數量。要獲得對資源的控制,任務必須首先獲得乙個訊號

- 遞減訊號計數值。當計數值達到零時,沒有空閒資源。當乙個任務完成資源處理時,它會返回訊號量

- 遞增訊號計數值。在這種情況下,希望計數值等於建立訊號量時的最大計數值。

freertos互斥體

互斥體是包含優先順序繼承機制的

二進位制訊號量

。二進位制訊號量是實現同步的更好選擇(在任務之間或任務與中斷之間),互斥鎖是實現簡單互斥(因此

'mut''排除'

)的更好選擇。

當互斥使用時,互斥就像用來守護資源的令牌。當任務希望訪問資源時,它必須首先獲取('取

')令牌。當資源完成後,它必須「給

」該令牌

- 允許其他任務有機會訪問相同的資源。

互斥量使用相同的訊號量訪問

api函式,因此也允許指定塊時間。阻止時間表示當互斥體不是立即可用時,如果嘗試「取

」互斥體,任務應進入阻塞狀態的最大

「節拍數

」。與二進位制訊號量不同

- 互斥量使用優先順序繼承。這意味著如果乙個高優先順序的任務在嘗試獲取當前由較低優先順序任務持有的互斥體(令牌)時阻塞,則持有該令牌的任務的優先順序暫時公升高到阻塞任務的優先順序。該機制旨在確保優先順序較高的任務在盡可能短的時間內處於阻塞狀態,從而儘量減少已發生的

「優先順序反轉」。

優先順序繼承不能**優先順序倒置!它在某些情況下將其影響降至最低。硬實時應用程式的設計應該優先反轉不首先發生。

不應該從中斷中使用互斥鎖,因為:

使用互斥鎖來保護對共享資源的訪問。

freertos遞迴互斥

乙個遞迴使用的互斥鎖可以被所有者重複使用。在所有者為每個成功的

xsemaphoretakerecursive

()請求呼叫

xsemaphoregiverecursive

()之前,互斥鎖不會再次可用。例如,如果某個任務成功'取得

'相同的互斥鎖

5次,則該互斥鎖將不可用於任何其他任務,直到它還將該互斥鎖'給出

'5次。

這種型別的訊號量使用優先順序繼承機制,因此一旦訊號量不再需要,訊號量的任務必須總是'給

''訊號量。

中斷服務程式中不能使用互斥鎖型別訊號量。

不應該從中斷中使用互斥鎖,因為:

ACE 任務間通訊

上一次提到了ace中的主動物件,其實每乙個任務都有乙個訊息佇列,這個訊息佇列可用作任務間通訊的一種方式。當乙個任務想要與另乙個任務通訊時,他建立乙個訊息,並將訊息放入它想通訊的任務的訊息佇列中。另乙個任務用getq 方法來獲得這個訊息。如果佇列中沒有訊息,任務就進入休眠狀態。下面的例子演示如何進行任...

VxWorks任務間通訊

1.共享記憶體 雙向鍊錶 環形緩衝 2.互斥 中斷鎖 作用域僅限於中斷內部。優先順序鎖 共享記憶體中,低優先順序的任務不允許被打斷,優先順序鎖就被使用。弊端 會完全禁止任務的排程。3.訊號量 一種指向semaphore結構的指標 sem eventsend err notify,釋放訊號量出錯返回錯...

rtx任務間通訊 互斥量

2013 11 06 luoqindong void os mut init os id mutex the mutex to initialize 初始化乙個互斥量,互斥量內部計數計為0,mutex型別必須為os mut.在呼叫互斥量相關函式之前,必須用該函式先初始化互斥量.os result o...