再議基于μC/OS-II的時(shí)間片調(diào)度法設(shè)計(jì)
引言
筆者曾在本刊2008年12期上發(fā)表過(guò)一篇文章——《基于μC/OS-11的時(shí)間片調(diào)度法設(shè)計(jì)》,近期在網(wǎng)絡(luò)上看到有很多感興趣的技術(shù)同行作了大量引用和轉(zhuǎn)載。根據(jù)在實(shí)際項(xiàng)目中的應(yīng)用經(jīng)驗(yàn),有必要對(duì)其再議,主要原因如下:
①多任務(wù)的時(shí)間片調(diào)度在嵌入式領(lǐng)域有實(shí)用價(jià)值。一方面是很多嵌入式軟件系統(tǒng)升級(jí)有這種需求,舊的軟件模塊基于Endless Loop實(shí)現(xiàn),升級(jí)到μC/OS-II后,若要最大限度地復(fù)用舊的軟件模塊,時(shí)間片調(diào)度算法是實(shí)現(xiàn)舊的設(shè)計(jì)模式到新架構(gòu)之間最簡(jiǎn)單的橋梁。另一方面,對(duì)于控制領(lǐng)域,存在大量的耗時(shí)任務(wù)無(wú)法自動(dòng)釋放控制權(quán),時(shí)間片調(diào)度降低了任務(wù)設(shè)計(jì)的復(fù)雜度。剛剛發(fā)布不久的μC/OS-II,推出的重大改進(jìn)之一就是增加了對(duì)Round Robin的支持,更是表明μC/OS-II的使用者們對(duì)該功能的實(shí)際需求是切實(shí)存在的。
②不更改μC/OS-II內(nèi)核代碼實(shí)現(xiàn)時(shí)間片調(diào)度。《基于μC/OS-II的時(shí)間片調(diào)度法設(shè)計(jì)》對(duì)OS內(nèi)核代碼作了修改,雖然很少但增加了系統(tǒng)耦合度,對(duì)日后的項(xiàng)目維護(hù)和第三方升級(jí)都是不利的。如果存在完全不用更改內(nèi)核而僅基于OS服務(wù)的正常調(diào)用的實(shí)現(xiàn)方案,對(duì)系統(tǒng)的可靠性和移植性都是有益的。
③相對(duì)μC/OS-III,μC/OS-II仍然有廣泛的應(yīng)用領(lǐng)域。μC/OS-III作出了重大的改進(jìn),增加了時(shí)間片調(diào)度,擴(kuò)展了任務(wù)數(shù)的限制,允許了同等優(yōu)先級(jí)任務(wù)的存在,更多新特性的引入帶來(lái)了內(nèi)核結(jié)構(gòu)的重整以及運(yùn)行時(shí)開(kāi)銷的增加。雖然可以通過(guò)配置優(yōu)化系統(tǒng),但就大部分的應(yīng)用而言,μC/OS-II完全能夠勝任,至少不需要僅僅為了時(shí)間片調(diào)度功能而選用μC/OS-III。
1 調(diào)度原理
該調(diào)度算法對(duì)系統(tǒng)的要求有兩點(diǎn):首先要建立一個(gè)額外的調(diào)度任務(wù)用于管理待調(diào)度的用戶任務(wù)時(shí)間片計(jì)時(shí)及其切換,我們將其命名為TaskRB_Scheduler;其次是保證其任務(wù)優(yōu)先級(jí)高于所有的待調(diào)度時(shí)間片任務(wù),保證調(diào)度任務(wù)能搶占所有被調(diào)度任務(wù)的控制權(quán)。
我們假設(shè)系統(tǒng)中有3個(gè)任務(wù)需要分享時(shí)間片,分別為TaskRB_1、TaskRB_2、TaskRB_3。為了實(shí)現(xiàn)時(shí)間片的調(diào)度功能,還需要額外的調(diào)度任務(wù)TaskRB Scheduler,于是系統(tǒng)中的將會(huì)有4個(gè)任務(wù)。其中,TaskRB Scheduler由初始化代碼創(chuàng)建,而待調(diào)度的3個(gè)用戶任務(wù)的創(chuàng)建和管理完全由TaskRB Scheduler任務(wù)來(lái)完成。
TaskRB_Scheduler的運(yùn)行分為兩個(gè)階段:首先是初始化階段,負(fù)責(zé)所有時(shí)間片任務(wù)的創(chuàng)立并確保其處于Suspend狀態(tài);然后是調(diào)度運(yùn)行階段,如圖1所示。
重復(fù)①~④步驟,對(duì)TaskRB_3分配運(yùn)行時(shí)間片。
簡(jiǎn)而言之,調(diào)度任務(wù)因?yàn)榫哂凶罡邇?yōu)先級(jí),可以根據(jù)時(shí)間片分配表啟動(dòng)并打斷待調(diào)度的時(shí)間片任務(wù),雖然時(shí)間片任務(wù)優(yōu)先級(jí)各不相同,但通過(guò)確保僅有一個(gè)時(shí)間片任務(wù)處于Readsr態(tài)的方法,避免了不同時(shí)間片任務(wù)之間的競(jìng)爭(zhēng)
沖突。
為簡(jiǎn)化示意圖,并沒(méi)有標(biāo)注中斷ISR行為的影響,事實(shí)上ISR只能影響到任務(wù)時(shí)間片的長(zhǎng)度而不會(huì)影響到任務(wù)片調(diào)度的流程;而對(duì)于時(shí)間片調(diào)度系統(tǒng)而言,通常都采用類似于前后臺(tái)系統(tǒng)的信號(hào)同步策略處理中斷數(shù)據(jù),這已經(jīng)不是本文討論的重點(diǎn)。
2 實(shí)現(xiàn)代碼
原理比較簡(jiǎn)單,僅僅給出 TaskRB_Scheduler部分代碼:
3 應(yīng)用擴(kuò)展
有項(xiàng)目經(jīng)驗(yàn)的人都深知Demo和產(chǎn)品有著天壤之別,這句話同樣適用于此時(shí)間片調(diào)度方案。在實(shí)際應(yīng)用中,我們還須關(guān)注到以下幾個(gè)方面。
(1)如何與非時(shí)間片調(diào)度任務(wù)協(xié)同工作
對(duì)于混合系統(tǒng)而言,作為時(shí)間片調(diào)度的任務(wù)通常都對(duì)實(shí)時(shí)性要求比較低,因此通常的做法是設(shè)置優(yōu)先級(jí):實(shí)時(shí)任務(wù)優(yōu)先級(jí)>TaskRB_Sche duler>時(shí)間片任務(wù)>IDLE,時(shí)間片精度會(huì)會(huì)因?yàn)閷?shí)時(shí)任務(wù)的搶占受到影響。
(2)如何處理時(shí)間片任務(wù)中的critical_section
critical section的處理很重要,我們一般不希望一個(gè)時(shí)間片任務(wù)在發(fā)送UART數(shù)據(jù)包的過(guò)程中被TaskRB_Scheduler暫時(shí)掐斷,但TaskRB_ Scheduler又的確無(wú)法預(yù)知時(shí)間片用戶的狀態(tài)。有兩種解決辦法:一是通過(guò)調(diào)度器上鎖,二是通過(guò)時(shí)間片任務(wù)和調(diào)度任務(wù)共享互斥量。顯然,調(diào)度器上鎖不是個(gè)好主意,會(huì)封鎖正常的任務(wù)切換,在上述的混合系統(tǒng)中簡(jiǎn)直是不可想象的,但在純粹的時(shí)間片調(diào)度系統(tǒng)中不會(huì)帶來(lái)太多的麻煩。共享互斥量增加了系統(tǒng)資源的消耗,在混合系統(tǒng)中的運(yùn)行時(shí)效率更高。
(3)運(yùn)行時(shí)配置
TaskRB_Scheduler一方面是時(shí)間片的調(diào)度器,另一方面也是一個(gè)普通的μC/OS-II任務(wù),在實(shí)際項(xiàng)目中可以通過(guò)創(chuàng)建任務(wù)鏈表的方式維護(hù)管理納入時(shí)間片調(diào)度的用戶任務(wù),在運(yùn)行時(shí)靈活地添加刪除任務(wù)列表以及調(diào)整時(shí)間片寬度。鑒于原理都很簡(jiǎn)單,實(shí)現(xiàn)代碼不再贅述。
評(píng)論