(十六)FreeRTOS佇列

2021-10-11 04:07:23 字數 908 閱讀 7958

圖1-1:讀寫佇列

圖1-1所示的佇列中,最多能儲存5個專案,並且假設佇列永遠不會滿。任務a使用api函式xqueuesendtoback()向佇列傳送資料,每次傳送乙個資料,新入隊的資料置於上一次入隊資料的後面。任務b使用api函式xqueuereceive()將資料從佇列取出,先入隊的資料先出隊。

通常情況下,魚和熊掌是不可兼得的,但freertos的佇列使用者模型管理卻兼顧簡單和靈活。傳送到佇列的訊息是通過拷貝實現的,這意味著佇列儲存的資料是原資料,而不是原資料的引用。freertos佇列具有以下特性:

api函式允許指定阻塞時間。

每當任務企圖從乙個空的佇列讀取資料時,任務會進入阻塞狀態(這樣任務不會消耗任何cpu時間並且另乙個任務可以執行)直到佇列**現有效資料或者阻塞時間到期。

每當任務企圖向乙個滿的佇列寫資料時,任務會進入阻塞狀態,直到佇列**現有效空間或者阻塞時間到期。

如果多個任務阻塞在乙個佇列上,那麼最高優先順序別的任務會第乙個解除阻塞。

注:中斷程式中絕不可以使用不帶「fromisr」結尾的api函式!

總結一下佇列的基本用法:

定義乙個佇列控制代碼變數,用於儲存建立的佇列:xqueuehandle xqueue1;

使用api函式xqueuecreate()建立乙個佇列。

如果希望使用先進先出佇列,使用api函式xqueuesend()或xqueuesendtoback()向佇列投遞佇列項。如果希望使用後進先出佇列,使用api函式xqueuesendtofront()向佇列投遞佇列項。如果在中斷服務程式中,切記使用它們的帶中斷保護版本。

使用api函式xqueuereceive()從佇列讀取佇列項,如果在中斷服務程式中,切記使用它們的帶中斷保護版本。

FreeRTOS佇列使用

佇列是任務間通訊的主要形式。常被用於任務與任務 中斷與任務之間的訊息傳遞,通常是fifo的形式。當乙個任務讀取空佇列時,這個任務將進入阻塞態 不消耗cpu,cpu會去執行其他任務 直到佇列不為空或者阻塞時長超過設定的阻塞時間,將進入就緒態。當乙個任務向滿佇列寫時,這個任務會進入阻塞態 不消耗cpu,...

FreeRTOS 佇列常用API函式

佇列建立xqueuecreate,此巨集最終呼叫函式xqueuegenericcreate queuehandle t xqueuecreate ubasetype t uxqueuelength,要建立的佇列的佇列長度,這裡是佇列的專案數 ubasetype t uxitemsize 佇列中每個專...

177 FreeRTOS使用佇列組

翻譯成佇列組不知道是否合適,直觀的翻譯應該是佇列集合。主要的作用就是能夠讓乙個task接收的訊息可以來自於不同型別以及大小的佇列,當然也可以是相同型別以及大小。這個我沒有考慮到我自己的應用中什麼時候會用到,簡單分析一下官方的示範 首先是建立兩個佇列,乙個佇列組,佇列的大小都是1。把兩個佇列新增到這個...