2.配置調(diào)度算法
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_SLICING 隨便
當(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)行了。
2.4
優(yōu)缺點(diǎn)
多任務(wù)訪問問題
在多任務(wù)程序中,應(yīng)用程序編寫人員必須注意一個(gè)資源不能被多個(gè)任務(wù)同時(shí)訪問,因?yàn)橥瑫r(shí)訪問可能會(huì)破壞資源。例如,考慮以下場(chǎng)景,其中正在訪問的資源是UART(串口)。兩個(gè)任務(wù)是向UART寫入字符串,任務(wù)1寫“abcdefghijklmnop”,任務(wù)2寫“123456789”:
1
Task 1處于運(yùn)行態(tài),開始寫它的字符串。它將“abcdefg”寫入U(xiǎn)ART,然后離開運(yùn)行態(tài)。
2
Task 2進(jìn)入運(yùn)行態(tài),并在離開運(yùn)行態(tài)之前向UART寫入“123456789”。
3
任務(wù)1重新進(jìn)入運(yùn)行態(tài),并將其字符串的剩余字符寫入U(xiǎn)ART。
在該場(chǎng)景中,實(shí)際寫入U(xiǎn)ART的內(nèi)容是“abcdefg123456789hijklmnop”。Task 1寫入的字符串沒有按照預(yù)期的連續(xù)順序?qū)懭險(xiǎn)ART,而是被損壞了,因?yàn)門ask 2寫入U(xiǎn)ART的字符串出現(xiàn)在UART中。
通常,使用協(xié)同調(diào)度比使用搶占調(diào)度更容易避免同時(shí)訪問引起的問題。
當(dāng)使用搶占式調(diào)度時(shí),運(yùn)行狀態(tài)任務(wù)可以在任何時(shí)候被搶占,包括當(dāng)它與另一個(gè)任務(wù)共享的資源處于不一致狀態(tài)時(shí)。正如剛才UART示例所演示的,讓資源處于不一致的狀態(tài)可能導(dǎo)致數(shù)據(jù)損壞。
當(dāng)使用協(xié)同調(diào)度時(shí),應(yīng)用程序編寫人員控制何時(shí)可以切換到另一個(gè)任務(wù)(干完想干的再阻塞,或者讓出)。因此,應(yīng)用程序編寫人員可以確保在資源處于不一致狀態(tài)時(shí)不會(huì)發(fā)生切換到另一個(gè)任務(wù)的情況。在上面的UART示例中,應(yīng)用程序編寫人員可以確保Task 1在將其整個(gè)字符串寫入U(xiǎn)ART之前不會(huì)離開運(yùn)行態(tài),這樣做可以消除字符串被另一個(gè)任務(wù)的激活破壞的可能性。
很明顯,協(xié)同調(diào)度比搶占調(diào)度響應(yīng)要慢。
當(dāng)使用協(xié)同調(diào)度時(shí),最高優(yōu)先級(jí)任務(wù)進(jìn)入就緒態(tài)時(shí)并不一定會(huì)立即執(zhí)行,必須等到運(yùn)行態(tài)任務(wù)進(jìn)入阻塞態(tài)或調(diào)用taskYIELD()才會(huì)被執(zhí)行。
使用搶占調(diào)度時(shí),當(dāng)一個(gè)比運(yùn)行態(tài)任務(wù)優(yōu)先級(jí)更高的任務(wù)進(jìn)入就緒態(tài)時(shí),這個(gè)任務(wù)會(huì)立即執(zhí)行。這一點(diǎn)對(duì)于必須在一定時(shí)間內(nèi)響應(yīng)高優(yōu)先級(jí)任務(wù)的實(shí)時(shí)系統(tǒng)是非常重要的。至于多任務(wù)訪問問題(其實(shí)也就是操作系統(tǒng)中的多線程問題),有其他手段去解決。
在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)的。
審核編輯:劉清
-
FreeRTOS
+關(guān)注
關(guān)注
12文章
493瀏覽量
64330 -
UART接口
+關(guān)注
關(guān)注
0文章
124瀏覽量
15873 -
中斷優(yōu)先級(jí)
+關(guān)注
關(guān)注
0文章
22瀏覽量
9580 -
調(diào)度器
+關(guān)注
關(guān)注
0文章
98瀏覽量
5500
原文標(biāo)題:FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和在RZ/T2L上的實(shí)踐(下)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
淺析FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和應(yīng)用

轉(zhuǎn):第14章 任務(wù)調(diào)度—搶占式,時(shí)間片和合作式
轉(zhuǎn)第16章 FreeRTOS調(diào)度鎖,任務(wù)鎖和中斷鎖
FreeRTOS如何使用delay作為系統(tǒng)延時(shí)、任務(wù)調(diào)度
調(diào)度器的原理及其任務(wù)調(diào)度代碼實(shí)現(xiàn)
基于實(shí)數(shù)編碼免疫算法的分布式任務(wù)調(diào)度
網(wǎng)格任務(wù)調(diào)度算法研究
云任務(wù)閾值調(diào)度算法

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

異構(gòu)多核處理器任務(wù)調(diào)度算法
Storm環(huán)境下基于權(quán)重的任務(wù)調(diào)度算法

可反映用戶偏好的多目標(biāo)任務(wù)調(diào)度算法
異構(gòu)環(huán)境下的多DAG任務(wù)調(diào)度算法綜述
FreeRTOS時(shí)間片進(jìn)行任務(wù)調(diào)度?

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

評(píng)論