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