2.配置調(diào)度算法
2.2
不帶時間片的搶占式調(diào)度
配置如下時,調(diào)度算法就會變成不帶時間片的搶占式調(diào)度
configUSE_PREEMPTION 1
configUSE_TIME_SLICING 0
和前面的唯一區(qū)別就是相同優(yōu)先級的任務之間不會隨時間自動切換。
如果不使用時間片,那么調(diào)度程序只會在發(fā)生這兩種情況時,進行任務切換:
1
優(yōu)先級更高的任務進入“就緒”態(tài)。
2
運行態(tài)任務變?yōu)樽枞麘B(tài)或被掛起。
很顯然,不使用時間片時,任務切換的情況會變少,所以關閉時間切片可以減少調(diào)度器的處理開銷。但是關閉時間切片也可能導致具有相同優(yōu)先級的任務獲得的處理時間相差很大。因此,一定要慎重使用。

task1為最高優(yōu)先級的事件驅(qū)動任務,task2和Idle task有相同的優(yōu)先級。但是由于關閉了時間片,任務切換只會在空閑任務阻塞或者掛起或者task1搶占后發(fā)生,所以空閑任務和task2雖然優(yōu)先級相同,但是明顯空閑任務占有的時間長很多。
2.3
協(xié)同調(diào)度
configUSE_PREEMPTION 0
configUSE_TIME_SLICING 隨便
當使用協(xié)同調(diào)度時,只有當運行態(tài)任務進入阻塞態(tài),或者運行態(tài)任務通過調(diào)用taskYIELD()主動讓出,才會發(fā)生任務切換。
任務永遠不會被搶占,不能使用時間片,時間片配置的值隨便,無所謂。

task1、2、3優(yōu)先級依次變低,剛開始task3運行,雖然task1和2優(yōu)先級高,并且沒有阻塞,但是也無法搶占,task3調(diào)用taskYIELD(),主動讓出,因為task1優(yōu)先級比task2高,task1就運行了,task1運行夠了進入阻塞態(tài),由于task2比task3優(yōu)先級高,task2就運行了。
2.4
優(yōu)缺點
多任務訪問問題
在多任務程序中,應用程序編寫人員必須注意一個資源不能被多個任務同時訪問,因為同時訪問可能會破壞資源。例如,考慮以下場景,其中正在訪問的資源是UART(串口)。兩個任務是向UART寫入字符串,任務1寫“abcdefghijklmnop”,任務2寫“123456789”:
1
Task 1處于運行態(tài),開始寫它的字符串。它將“abcdefg”寫入UART,然后離開運行態(tài)。
2
Task 2進入運行態(tài),并在離開運行態(tài)之前向UART寫入“123456789”。
3
任務1重新進入運行態(tài),并將其字符串的剩余字符寫入UART。
在該場景中,實際寫入UART的內(nèi)容是“abcdefg123456789hijklmnop”。Task 1寫入的字符串沒有按照預期的連續(xù)順序?qū)懭險ART,而是被損壞了,因為Task 2寫入UART的字符串出現(xiàn)在UART中。
通常,使用協(xié)同調(diào)度比使用搶占調(diào)度更容易避免同時訪問引起的問題。
當使用搶占式調(diào)度時,運行狀態(tài)任務可以在任何時候被搶占,包括當它與另一個任務共享的資源處于不一致狀態(tài)時。正如剛才UART示例所演示的,讓資源處于不一致的狀態(tài)可能導致數(shù)據(jù)損壞。
當使用協(xié)同調(diào)度時,應用程序編寫人員控制何時可以切換到另一個任務(干完想干的再阻塞,或者讓出)。因此,應用程序編寫人員可以確保在資源處于不一致狀態(tài)時不會發(fā)生切換到另一個任務的情況。在上面的UART示例中,應用程序編寫人員可以確保Task 1在將其整個字符串寫入UART之前不會離開運行態(tài),這樣做可以消除字符串被另一個任務的激活破壞的可能性。
很明顯,協(xié)同調(diào)度比搶占調(diào)度響應要慢。
當使用協(xié)同調(diào)度時,最高優(yōu)先級任務進入就緒態(tài)時并不一定會立即執(zhí)行,必須等到運行態(tài)任務進入阻塞態(tài)或調(diào)用taskYIELD()才會被執(zhí)行。
使用搶占調(diào)度時,當一個比運行態(tài)任務優(yōu)先級更高的任務進入就緒態(tài)時,這個任務會立即執(zhí)行。這一點對于必須在一定時間內(nèi)響應高優(yōu)先級任務的實時系統(tǒng)是非常重要的。至于多任務訪問問題(其實也就是操作系統(tǒng)中的多線程問題),有其他手段去解決。
在RZ/T2L上做的實驗
如果兩個參數(shù)設置為:configUSE_PREEMPTION =0,configUSE_TIME_SLICING= 0或者1(隨便) 稱之為協(xié)同調(diào)度,當使用協(xié)同調(diào)度時,只有當運行態(tài)任務進入阻塞態(tài),或者運行態(tài)任務通過調(diào)用taskYIELD()主動讓出,才會發(fā)生任務切換。
任務永遠不會被搶占,不能使用時間片,時間片配置的值隨便。我做了一個實驗截圖如下:


上面的實驗說明 “只有當運行態(tài)任務進入阻塞態(tài),或者運行態(tài)任務通過調(diào)用taskYIELD()主動讓出,才會發(fā)生任務切換”,此時與時間片1 ms已經(jīng)沒有什么關系了。
如果兩個參數(shù)設置為 configUSE_PREEMPTION =1,configUSE_TIME_SLICING=1, 此時只有兩個任務并且優(yōu)先級相同,每個任務都持續(xù)做一件事情就會出現(xiàn)時間征為1ms的輪轉(zhuǎn)情況:


通過上面的兩個實驗可以說明,時間片存的意義是相同優(yōu)先級并且持續(xù)時間較長的處理任務,需要平等分享CPU使用權。但是如果一旦有一方主動放棄CPU或者阻塞或者更高優(yōu)先級任務來了,調(diào)度器是不會等待一個時間片完全結(jié)束,再去調(diào)度就緒列表中的任務的,而是直接調(diào)用就緒列表里的第一個任務。這樣的設計我認為是合理的,如果一定要等待時間片結(jié)束,是存在嚴重的資源浪費的。
審核編輯:劉清
-
FreeRTOS
+關注
關注
14文章
497瀏覽量
66414 -
UART接口
+關注
關注
0文章
124瀏覽量
16312 -
中斷優(yōu)先級
+關注
關注
0文章
22瀏覽量
9693 -
調(diào)度器
+關注
關注
0文章
99瀏覽量
5638
發(fā)布評論請先 登錄
FreeRTOS任務調(diào)度及優(yōu)先級問題
freertos關閉任務調(diào)度的方法
轉(zhuǎn):第14章 任務調(diào)度—搶占式,時間片和合作式
轉(zhuǎn)第16章 FreeRTOS調(diào)度鎖,任務鎖和中斷鎖
調(diào)度器的原理及其任務調(diào)度代碼實現(xiàn)
基于實數(shù)編碼免疫算法的分布式任務調(diào)度
網(wǎng)格任務調(diào)度算法研究
云任務閾值調(diào)度算法
基于改進GEP的局部云任務調(diào)度算法
異構(gòu)多核處理器任務調(diào)度算法
Storm環(huán)境下基于權重的任務調(diào)度算法
FreeRTOS時間片進行任務調(diào)度?
FreeRTOS調(diào)度器中的三種調(diào)度算法實踐(上)

FreeRTOS任務調(diào)度器的三種調(diào)度算法講解(下)
評論