佇列是任務間通訊的主要形式。常被用於任務與任務、中斷與任務之間的訊息傳遞,通常是fifo的形式。當乙個任務讀取空佇列時,這個任務將進入阻塞態(不消耗cpu,cpu會去執行其他任務),直到佇列不為空或者阻塞時長超過設定的阻塞時間,將進入就緒態。當乙個任務向滿佇列寫時,這個任務會進入阻塞態(不消耗cpu,cpu會去執行其他任務),直到佇列不為滿或者阻塞時長超過設定的阻塞時間,將進入就緒態。
如果有多個任務因為同乙個佇列而進入阻塞態,當佇列滿足條件的時候,優先順序最高的任務先解除阻塞態,其他任務繼續阻塞。
中斷裡面只能使用字尾帶有「fromisr」的api。
typedef void * queuehandle_t; //佇列控制代碼
queuehandle_t xqueuecreate(ubasetype_t uxqueuelength,ubasetype_t uxitemsize );//建立佇列
basetype_t xqueuesend( queuehandle_t xqueue,const void * pvitemtoqueue,ticktype_t xtickstowait);//向佇列寫資料
basetype_t xqueuereceive(queuehandle_t xqueue,void *pvbuffer,ticktype_t xtickstowait);//從佇列裡面讀取資料
basetype_t xqueuesendfromisr(queuehandle_t xqueue,const void *pvitemtoqueue,basetype_t*pxhigherprioritytaskwoken);
//向佇列裡面寫入資料,用在中斷中
總體設計:總共4個任務,2個佇列建立任務和佇列:lcdtask:顯示當前計數,並向佇列tasktotaskqueue裡面寫入當前計數;
testtask0:讀取佇列tasktotaskqueue裡面的資料,並串列埠列印;
testtask1:1s串列埠列印一次資料;
queuetask:讀取佇列tasktoirqqueue的資料並列印出來;
串列埠中斷:收到資料後往佇列tasktoirqqueue裡面寫入收到的資料。
各個任務函式:#define lcd_task_prio 1 //任務優先順序
#define lcd_task_stk_size 80 //任務堆疊大小
taskhandle_t lcdtaskhandler; //任務控制代碼
void lcdtaskfunc(void *pvparameters); //任務函式
#define test_task0_prio 2 //任務優先順序
#define test_task0_stk_size 50 //任務堆疊大小
taskhandle_t testtask0handler; //任務控制代碼
void testtask0func(void *pvparameters); //任務函式
#define test_task1_prio 3 //任務優先順序
#define test_task1_stk_size 80 //任務堆疊大小
taskhandle_t testtask1handler; //任務控制代碼
void testtask1func(void *pvparameters); //任務函式
#define queue_task_prio 4 //任務優先順序
#define queue_task_stk_size 80 //任務堆疊大小
taskhandle_t queuetaskhandler; //任務控制代碼
void queuetaskfunc(void *pvparameters); //任務函式
queuehandle_t tasktoirqqueue; //資訊佇列控制代碼
queuehandle_t tasktotaskqueue; //資訊佇列控制代碼
void othertest(void )
串列埠中斷函式中寫資料到佇列://lcd顯示任務當前計數,並把當前計數寫入tasktotaskqueue佇列函式
void lcdtaskfunc(void *pvparameters)
; static uint8_t i=0;
for(;;)
}//test0任務函式,讀取 tasktotaskqueue的資料並列印
void testtask0func(void *pvparameters)
}}
//test1任務函式
void testtask1func(void *pvparameters)
}//從佇列讀取串列埠收到的資料並列印任務函式
void queuetaskfunc(void *pvparameters)
} }
}
執行結果:void usart1_irqhandler( void )
(十六)FreeRTOS佇列
圖1 1 讀寫佇列 圖1 1所示的佇列中,最多能儲存5個專案,並且假設佇列永遠不會滿。任務a使用api函式xqueuesendtoback 向佇列傳送資料,每次傳送乙個資料,新入隊的資料置於上一次入隊資料的後面。任務b使用api函式xqueuereceive 將資料從佇列取出,先入隊的資料先出隊。通...
177 FreeRTOS使用佇列組
翻譯成佇列組不知道是否合適,直觀的翻譯應該是佇列集合。主要的作用就是能夠讓乙個task接收的訊息可以來自於不同型別以及大小的佇列,當然也可以是相同型別以及大小。這個我沒有考慮到我自己的應用中什麼時候會用到,簡單分析一下官方的示範 首先是建立兩個佇列,乙個佇列組,佇列的大小都是1。把兩個佇列新增到這個...
FreeRTOS 佇列常用API函式
佇列建立xqueuecreate,此巨集最終呼叫函式xqueuegenericcreate queuehandle t xqueuecreate ubasetype t uxqueuelength,要建立的佇列的佇列長度,這裡是佇列的專案數 ubasetype t uxitemsize 佇列中每個專...