FreeRTOS佇列使用

2021-10-03 01:15:08 字數 2937 閱讀 2915

佇列是任務間通訊的主要形式。常被用於任務與任務、中斷與任務之間的訊息傳遞,通常是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 佇列中每個專...