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