在嵌入式實時操作系統(tǒng)中,都會有空閑任務的存在,這個任務是伴隨著操作系統(tǒng)啟動之后而存在的。正常情況來說,系統(tǒng)不掛掉,空閑任務都會一直存在。
freeRTOS 調(diào)度器啟動時,自動創(chuàng)建空閑任務,以確保系統(tǒng)中始終存在一個能夠運行的任務。 它是以最低優(yōu)先級創(chuàng)建,以確保如果有更高的優(yōu)先級的任務處于準備就緒狀態(tài),則空閑任務不使用任何 CPU 時間,讓渡出CPU的使用權給到更高優(yōu)先級的就緒任務去執(zhí)行。
freeRTOS中創(chuàng)建空閑任務的代碼如下:
xTaskCreate( prvIdleTask,
configIDLE_TASK_NAME,
configMINIMAL_STACK_SIZE,
( void * ) NULL,
portPRIVILEGE_BIT,
&xIdleTaskHandle );
空閑任務的作用:
(1)釋放內(nèi)存
如果一個任務刪除另外的任務,那個被刪除的任務的TCB塊和堆棧空間會被馬上釋放掉;
如果一個任務自己刪除了自己,那么這個刪除自身的任務的TCB塊和堆棧空間是由空閑任務進行回收的,空閑任務會去查詢有沒有自己刪除自己的任務,如果有就會去回收這個任務的TCB塊和堆棧空間。如下:
(2)處理空閑優(yōu)先級任務
在freeRTOS中,如果使用搶占式的調(diào)度方式,具有相同優(yōu)先級的任務是通過時間片的方式獲取CPU使用權限的。通過時間片共享同一個優(yōu)先級的多個任務,如果共享的優(yōu)先級大于空閑優(yōu)先級,并假設沒有更高優(yōu)先級的任務,這些任務應該獲得相同的處理器時間。
但是在空閑任務優(yōu)先級相同的情況下,這點是有些不同的。
如果有與空閑任務相同的優(yōu)先級的其他任務,在宏 configIDLE_SHOULD_YIELD 為1時,空閑任務是不必等到時間片耗盡再進行任務切換的。意思是:時間片輪轉(zhuǎn)到空閑任務執(zhí)行時,如果這個時候檢查到還有其他的任務處于就緒狀態(tài),空閑任務就直接把cpu執(zhí)行權交給其他的任務,而不需要等待空閑任務的時間片使用完。
當然,這種情況是需要滿足下面的條件才能夠?qū)崿F(xiàn)的:
1)系統(tǒng)調(diào)度方式使用的是搶占式的方式
2)有與空閑任務相同優(yōu)先級的其他任務
3)宏 configIDLE_SHOULD_YIELD 設置為 1
如下例所示:
假設有三個任務A、B、C,他們的任務優(yōu)先級與空閑任務I相同,并且宏 configIDLE_SHOULD_YIELD 為 1,那么任務A、B、C、I 的執(zhí)行如下圖演示:
假設上下文切換周期性的發(fā)生在T0、T1…T6時刻,當T2時刻是空閑任務執(zhí)行,然后發(fā)現(xiàn)任務A處于就緒,空閑任務I就會把cpu使用權讓給任務A。但是這個時候下,任務A執(zhí)行的時間片變短,因為空閑任務I占據(jù)了一部分的時間。這樣相比之下,任務A比任務B、C的執(zhí)行時間就變短了。
有什么辦法解決這個問題嗎?可以按照下面的方法考慮一下:
1)將跟空閑任務優(yōu)先級相同的其他任務使用空閑鉤子函數(shù)實現(xiàn);
2)用戶任務的任務優(yōu)先級大于空閑任務的優(yōu)先級;
3)設置 configIDLE_SHOULD_YIELD 為 0,不讓空閑任務讓出cpu使用權;
(3)執(zhí)行空閑任務鉤子函數(shù)
空閑任務鉤本質(zhì)就是一個函數(shù),這個函數(shù)需要用戶去實現(xiàn),但是RTOS中規(guī)定了函數(shù)的名字和參數(shù)。如下:
voidvApplicationIdleHook(void);
這個鉤子函數(shù)在每個空閑任務周期都會被調(diào)用。
要使用這個鉤子函數(shù)的話,還需要再FreeRTOSConfig.h文件中將一個宏置 1,如下:
#define configUSE_IDLE_HOOK 1
特別要注意的是:空閑任務的鉤子函數(shù)里面不可以調(diào)用會引起阻塞的API,比如消息隊列、vTaskDelay()、消息郵箱、信號量之類的。
-
嵌入式
+關注
關注
5127文章
19457瀏覽量
313479 -
cpu
+關注
關注
68文章
11015瀏覽量
215370 -
內(nèi)存
+關注
關注
8文章
3103瀏覽量
74910 -
操作系統(tǒng)
+關注
關注
37文章
7032瀏覽量
124779 -
FreeRTOS
+關注
關注
12文章
485瀏覽量
63567
發(fā)布評論請先 登錄
FreeRTOS中的任務管理
STM32__UCOSII系統(tǒng)啟動過程中空閑任務和統(tǒng)計任務扮演怎樣的角色?
FreeRTOS任務如何創(chuàng)建和刪除?
(一)FreeRTOS學習之FreeRTOS任務基礎知識

FreeRTOS高級篇11---空閑任務分析

FreeRTOS高級篇2---FreeRTOS任務創(chuàng)建分析

FreeRTOS系列第10篇---FreeRTOS任務創(chuàng)建和刪除

評論