177 FreeRTOS使用佇列組

2021-10-01 04:35:04 字數 840 閱讀 1868

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

首先是建立兩個佇列,乙個佇列組,佇列的大小都是1。把兩個佇列新增到這個佇列組中。接下來,建立了3個task,從**直白表達上,兩個低優先順序的task用來傳送訊號,而高優先順序的用來接收兩個任務發出的訊號。這樣,排程器啟動後應該是從接收任務開始執行。

再看一下任務的設計。

兩個任務都是阻塞型任務,其實有了佇列的傳送動作已經算是阻塞了。不過,這裡的差異在於這個阻塞應該能夠改變兩個任務的傳送速度。單純從傳送的任務設計看,似乎與一般的佇列傳送沒什麼太大的差異,唯一的差異是這次傳送的是倆佇列。

再看一下接收,與之前單個佇列的處理不同,接收的時候首先進行了乙個選擇,從注釋看其實這個就已經完成了乙個阻塞的操作了。如果這個阻塞被解除,則意味著可以從某個佇列接收訊息了。之後,接收訊息的動作將使得傳送的task解除傳送相關的阻塞。

看一下執行效果:

確實是看得出兩倍的傳送速度差異。

FreeRTOS佇列使用

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

(十六)FreeRTOS佇列

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

FreeRTOS 佇列常用API函式

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