FreeRTOS在MCU領(lǐng)域應(yīng)用非常廣泛,今天就給大家講解一下FreeRTOS調(diào)度器中的三種調(diào)度算法,以及在瑞薩RZ/T2L MPU中的應(yīng)用。
1.任務(wù)狀態(tài)和事件的概述
RTOS,即實(shí)時(shí)操作系統(tǒng),是一種能夠在規(guī)定時(shí)間內(nèi)響應(yīng)外部事件或數(shù)據(jù),并控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)做出快速響應(yīng)的操作系統(tǒng)。RTOS通過調(diào)度一切可利用的資源完成實(shí)時(shí)任務(wù),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行。RTOS的主要特點(diǎn)包括提供及時(shí)響應(yīng)和高可靠性。
在RTOS中,任務(wù)狀態(tài)通常包括以下幾種:
就緒態(tài)(Ready):任務(wù)已經(jīng)準(zhǔn)備好執(zhí)行,所有必要資源都已經(jīng)準(zhǔn)備就緒,只等待RTOS調(diào)度器選中并分配CPU時(shí)間。新創(chuàng)建的任務(wù)通常立即進(jìn)入就緒狀態(tài),等待調(diào)度器的調(diào)度。
運(yùn)行態(tài)(Running):任務(wù)正在執(zhí)行,占據(jù)了CPU資源。當(dāng)任務(wù)被RTOS調(diào)度器選中后,其上下文會(huì)被加載到CPU寄存器中,開始執(zhí)行任務(wù)代碼。
阻塞態(tài)(Blocked):任務(wù)暫時(shí)不能執(zhí)行,通常是因?yàn)榈却承┩獠渴录?,如I/O操作完成、定時(shí)器到期、信號(hào)量或互斥量被釋放等。一旦這些事件發(fā)生,任務(wù)會(huì)重新進(jìn)入就緒狀態(tài),等待調(diào)度器的調(diào)度。
掛起態(tài)(Suspended):任務(wù)被主動(dòng)掛起,不參與調(diào)度,需要手動(dòng)恢復(fù)才能回到就緒態(tài)。掛起狀態(tài)的任務(wù)不會(huì)執(zhí)行,直到被其他任務(wù)或中斷調(diào)用特定的API函數(shù)恢復(fù)。
RTOS中的事件是指能夠觸發(fā)任務(wù)狀態(tài)改變或任務(wù)執(zhí)行的某些外部或內(nèi)部發(fā)生的情況。事件可以是來自硬件的中斷、定時(shí)器到期、消息隊(duì)列中的消息到達(dá)等。RTOS通過事件來同步和協(xié)調(diào)任務(wù)的執(zhí)行,確保它們能夠按照預(yù)期的方式和時(shí)間順序運(yùn)行。
2.FreeRTOS調(diào)度算法
FreeRTOS它支持多種任務(wù)調(diào)度算法,可通過配置來滿足不同應(yīng)用的需求。
通過配置 configUSE_PREEMPTION 和 configUSE_TIME_SLICING 來更改算法。這兩個(gè)常量都在FreeRTOSConfig.h中定義。
還有個(gè)配置常數(shù)configUSE_TICKLESS_IDLE也會(huì)影響調(diào)度算法,因?yàn)槭褂盟鼤?huì)導(dǎo)致tick中斷在很長(zhǎng)一段時(shí)間內(nèi)被完全關(guān)閉。
configUSE_TICKLESS_IDLE是一個(gè)高級(jí)選項(xiàng),專門用于必須最小化功耗的應(yīng)用程序。configUSE_TICKLESS_IDLE在之后解說。
對(duì)于相同優(yōu)先級(jí)的任務(wù),F(xiàn)reeRTOS調(diào)度器依次選中相同優(yōu)先級(jí)的任務(wù)進(jìn)入運(yùn)行態(tài)。這種輪流策略被稱為‘Round Robin Scheduling’
‘Round Robin Scheduling’算法并不能保證同等優(yōu)先級(jí)的任務(wù)之間運(yùn)行相同的時(shí)間,只能保證同等優(yōu)先級(jí)的“就緒”任務(wù)會(huì)依次進(jìn)入“運(yùn)行”態(tài)。
2.1
基于時(shí)間片的搶占式調(diào)度
如果按照如下配置:
configUSE_PREEMPTION 1
configUSE_TIME_SLICING 1
FreeRTOS調(diào)度器使用一種稱為“基于時(shí)間片的固定優(yōu)先級(jí)搶占式調(diào)度”的調(diào)度算法,這是大多數(shù)小型RTOS應(yīng)用程序使用的調(diào)度算法。
固定優(yōu)先級(jí)
被描述為“固定優(yōu)先級(jí)”的調(diào)度算法不會(huì)改變分配給被調(diào)度任務(wù)的優(yōu)先級(jí),但也不會(huì)阻止任務(wù)本身改變自己的優(yōu)先級(jí)或其他任務(wù)的優(yōu)先級(jí)。
搶占式調(diào)度
在優(yōu)先級(jí)高于運(yùn)行態(tài)任務(wù)的任務(wù)進(jìn)入就緒態(tài)時(shí),調(diào)度器立即讓這個(gè)高優(yōu)先級(jí)的任務(wù)“搶占”運(yùn)行態(tài)任務(wù)。被搶占意味著任務(wù)移出運(yùn)行態(tài)并進(jìn)入就緒態(tài),并不是因?yàn)槿蝿?wù)自己主動(dòng)讓出或者阻塞。
時(shí)間片
時(shí)間片用于在具有相同優(yōu)先級(jí)的任務(wù)之間共享處理時(shí)間,即使任務(wù)沒有顯式地讓步或進(jìn)入阻塞狀態(tài)。使用“時(shí)間片”的調(diào)度算法將在每個(gè)時(shí)間片結(jié)束時(shí)選擇一個(gè)新任務(wù)進(jìn)入運(yùn)行狀態(tài),如果有其他與運(yùn)行任務(wù)具有相同優(yōu)先級(jí)的就緒狀態(tài)任務(wù)。一個(gè)時(shí)間片等于兩個(gè)RTOS tick中斷之間的時(shí)間。
上圖演示了使用“基于時(shí)間片的固定優(yōu)先級(jí)搶占式調(diào)度”算法搶占調(diào)度任務(wù)的調(diào)度過程。
task1是最高優(yōu)先級(jí)的事件驅(qū)動(dòng)任務(wù),task2是中等優(yōu)先級(jí)的周期性任務(wù),task3是最低優(yōu)先級(jí)的事件驅(qū)動(dòng)任務(wù),Idle task是空閑任務(wù)。
task1周期性運(yùn)行,阻塞時(shí),空閑任務(wù)就會(huì)運(yùn)行,task3的事件到達(dá)就會(huì)搶占空閑任務(wù),task3運(yùn)行期間,如果task2的周期到了,因?yàn)閠ask2優(yōu)先級(jí)高就會(huì)搶占task3,task2運(yùn)行完了再接著運(yùn)行task2,task2運(yùn)行期間,由于task1優(yōu)先級(jí)高,一旦task1等待的事件到了就會(huì)搶占task2。
有相同優(yōu)先級(jí)任務(wù)的情況:
task1是優(yōu)先級(jí)最高的事件驅(qū)動(dòng)任務(wù),task2是和Idle task優(yōu)先級(jí)相同的持續(xù)處理型任務(wù)。
task2和空閑任務(wù)就會(huì)輪流運(yùn)行,而task1則可以搶占task2和空閑任務(wù)。
假如空閑任務(wù)里其實(shí)沒做什么事情,我們想讓和空閑任務(wù)相同優(yōu)先級(jí)的Task2有更多的運(yùn)行時(shí)間就可以配置configIDLE_SHOULD_YIELD。
如果configIDLE_SHOULD_YIELD設(shè)置為0,那么空閑任務(wù)將在整個(gè)時(shí)間片中保持運(yùn)行狀態(tài),除非它被更高優(yōu)先級(jí)的任務(wù)搶占。
如果configIDLE_SHOULD_YIELD設(shè)置為1,如果有其他空閑優(yōu)先級(jí)任務(wù)處于就緒狀態(tài),那么空閑任務(wù)將主動(dòng)讓出運(yùn)行時(shí)間。
2.2
不帶時(shí)間片的搶占式調(diào)度
配置如下時(shí),調(diào)度算法就會(huì)變成不帶時(shí)間片的搶占式調(diào)度
configUSE_PREEMPTION 1
configUSE_TIME_SLICING 0
和前面的唯一區(qū)別就是相同優(yōu)先級(jí)的任務(wù)之間不會(huì)隨時(shí)間自動(dòng)切換。
如果不使用時(shí)間片,那么調(diào)度程序只會(huì)在發(fā)生這兩種情況時(shí),進(jìn)行任務(wù)切換:
1
優(yōu)先級(jí)更高的任務(wù)進(jìn)入“就緒”態(tài)。
2
運(yùn)行態(tài)任務(wù)變?yōu)樽枞麘B(tài)或被掛起。
很顯然,不使用時(shí)間片時(shí),任務(wù)切換的情況會(huì)變少,所以關(guān)閉時(shí)間切片可以減少調(diào)度器的處理開銷。但是關(guān)閉時(shí)間切片也可能導(dǎo)致具有相同優(yōu)先級(jí)的任務(wù)獲得的處理時(shí)間相差很大。因此,一定要慎重使用。
task1為最高優(yōu)先級(jí)的事件驅(qū)動(dòng)任務(wù),task2和Idle task有相同的優(yōu)先級(jí)。但是由于關(guān)閉了時(shí)間片,任務(wù)切換只會(huì)在空閑任務(wù)阻塞或者掛起或者task1搶占后發(fā)生,所以空閑任務(wù)和task2雖然優(yōu)先級(jí)相同,但是明顯空閑任務(wù)占有的時(shí)間長(zhǎng)很多。
2.3
協(xié)同調(diào)度
configUSE_PREEMPTION 0
configUSE_TIME_SLICINGx
當(dāng)使用協(xié)同調(diào)度時(shí),只有當(dāng)運(yùn)行態(tài)任務(wù)進(jìn)入阻塞態(tài),或者運(yùn)行態(tài)任務(wù)通過調(diào)用taskYIELD()主動(dòng)讓出,才會(huì)發(fā)生任務(wù)切換。
任務(wù)永遠(yuǎn)不會(huì)被搶占,不能使用時(shí)間片,時(shí)間片配置的值隨便,無所謂。
task1、2、3優(yōu)先級(jí)依次變低,剛開始task3運(yùn)行,雖然task1和2優(yōu)先級(jí)高,并且沒有阻塞,但是也無法搶占,task3調(diào)用taskYIELD(),主動(dòng)讓出,因?yàn)閠ask1優(yōu)先級(jí)比task2高,task1就運(yùn)行了,task1運(yùn)行夠了進(jìn)入阻塞態(tài),由于task2比task3優(yōu)先級(jí)高,task2就運(yùn)行了。
在RZ/T2L上做的實(shí)驗(yàn)
如果兩個(gè)參數(shù)設(shè)置為:configUSE_PREEMPTION =0,configUSE_TIME_SLICING= 0或者1(隨便) 稱之為協(xié)同調(diào)度,當(dāng)使用協(xié)同調(diào)度時(shí),只有當(dāng)運(yùn)行態(tài)任務(wù)進(jìn)入阻塞態(tài),或者運(yùn)行態(tài)任務(wù)通過調(diào)用taskYIELD()主動(dòng)讓出,才會(huì)發(fā)生任務(wù)切換。
任務(wù)永遠(yuǎn)不會(huì)被搶占,不能使用時(shí)間片,時(shí)間片配置的值隨便。我做了一個(gè)實(shí)驗(yàn)截圖如下:
上面的實(shí)驗(yàn)說明“只有當(dāng)運(yùn)行態(tài)任務(wù)進(jìn)入阻塞態(tài),或者運(yùn)行態(tài)任務(wù)通過調(diào)用taskYIELD()主動(dòng)讓出,才會(huì)發(fā)生任務(wù)切換”,此時(shí)與時(shí)間片1 ms已經(jīng)沒有什么關(guān)系了。
如果兩個(gè)參數(shù)設(shè)置為 configUSE_PREEMPTION =1,configUSE_TIME_SLICING=1, 此時(shí)只有兩個(gè)任務(wù)并且優(yōu)先級(jí)相同,每個(gè)任務(wù)都持續(xù)做一件事情就會(huì)出現(xiàn)時(shí)間征為1ms的輪轉(zhuǎn)情況:
通過上面的兩個(gè)實(shí)驗(yàn)可以說明,時(shí)間片存的意義是相同優(yōu)先級(jí)并且持續(xù)時(shí)間較長(zhǎng)的處理任務(wù),需要平等分享CPU使用權(quán)。但是如果一旦有一方主動(dòng)放棄CPU或者阻塞或者更高優(yōu)先級(jí)任務(wù)來了,調(diào)度器是不會(huì)等待一個(gè)時(shí)間片完全結(jié)束,再去調(diào)度就緒列表中的任務(wù)的,而是直接調(diào)用就緒列表里的第一個(gè)任務(wù)。這樣的設(shè)計(jì)我認(rèn)為是合理的,如果一定要等待時(shí)間片結(jié)束,是存在嚴(yán)重的資源浪費(fèi)的。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124578 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3298瀏覽量
119018 -
中斷處理
+關(guān)注
關(guān)注
0文章
94瀏覽量
11263 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
493瀏覽量
64375 -
調(diào)度算法
+關(guān)注
關(guān)注
1文章
68瀏覽量
12112 -
調(diào)度器
+關(guān)注
關(guān)注
0文章
98瀏覽量
5505
原文標(biāo)題:熱文分享| FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和應(yīng)用
文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
轉(zhuǎn):第14章 任務(wù)調(diào)度—搶占式,時(shí)間片和合作式
轉(zhuǎn)第16章 FreeRTOS調(diào)度鎖,任務(wù)鎖和中斷鎖
FreeRTOS如何使用delay作為系統(tǒng)延時(shí)、任務(wù)調(diào)度
請(qǐng)問FreeRTOS是如何實(shí)現(xiàn)調(diào)度的?
調(diào)度器的原理及其任務(wù)調(diào)度代碼實(shí)現(xiàn)
基于實(shí)數(shù)編碼免疫算法的分布式任務(wù)調(diào)度
網(wǎng)格任務(wù)調(diào)度算法研究
云任務(wù)閾值調(diào)度算法

基于云計(jì)算遺傳算法的多任務(wù)調(diào)度算法
基于改進(jìn)GEP的局部云任務(wù)調(diào)度算法

異構(gòu)多核處理器任務(wù)調(diào)度算法
FreeRTOS時(shí)間片調(diào)度

FreeRTOS時(shí)間片進(jìn)行任務(wù)調(diào)度?

FreeRTOS調(diào)度器中的三種調(diào)度算法實(shí)踐(上)

評(píng)論