基于μC/0S―II的時(shí)問(wèn)片調(diào)度法設(shè)計(jì)
#define OS_STAT_TS_USEUP 0x40
2.2 相關(guān)函數(shù)的修改
對(duì)0S_TCBInit()、OSTimeTick()、OSTimeD1y()、OS_EventTaskWait()、OS_EventTaskRdy()這5個(gè)函數(shù)的修改,是在μC/OS―II基礎(chǔ)上實(shí)現(xiàn)時(shí)間片調(diào)度法的關(guān)鍵。下面將一一對(duì)這幾個(gè)函數(shù)的修改部分進(jìn)行說(shuō)明。
在初始化任務(wù)控制塊的函數(shù)0S_TCBInit()中,筆者添加以下代碼讓新創(chuàng)建的任務(wù)處于時(shí)間片就緒表中,并根據(jù)任務(wù)優(yōu)先級(jí)對(duì)任務(wù)的時(shí)間片大小進(jìn)行初始化。本文引用地址:http://www.ex-cimer.com/article/188642.htm
0STimeTick()函數(shù)在每個(gè)時(shí)鐘滴答被調(diào)用,在時(shí)間片調(diào)度過(guò)程中起到了遞減時(shí)間片計(jì)數(shù)器的作用。當(dāng)計(jì)數(shù)器為0時(shí),進(jìn)行任務(wù)切換或是重新給各個(gè)任務(wù)分配時(shí)間片并開(kāi)始新一輪調(diào)度。
OSTimeDly()函數(shù)的作用是將任務(wù)延時(shí)一定的時(shí)間。這種情況下,應(yīng)該把該任務(wù)從時(shí)間片調(diào)度表中清除。
當(dāng)某個(gè)任務(wù)須等待一個(gè)事件的發(fā)生時(shí),信號(hào)量、互斥型信號(hào)量、郵箱及消息隊(duì)列會(huì)通過(guò)相應(yīng)的PEND函數(shù)調(diào)用函數(shù)OS_EventTaskwait(),使當(dāng)前任務(wù)從就緒任務(wù)表中脫離就緒態(tài),此時(shí)還需把當(dāng)前任務(wù)從時(shí)問(wèn)片調(diào)度表中清除。筆者在OS_EventTaskWait()函數(shù)中添加了以下代碼:
相應(yīng)地,當(dāng)某個(gè)事件發(fā)生了,信號(hào)量、互斥型信號(hào)量、郵箱及消息隊(duì)列會(huì)通過(guò)相應(yīng)的POST函數(shù)調(diào)用OS_Even―tTaskRdy(),從等待任務(wù)隊(duì)列中使最高優(yōu)先級(jí)任務(wù)脫離等待狀態(tài),此時(shí)還需要把該任務(wù)添加到時(shí)間片調(diào)度表中。筆者在0S_EventTaskRdy()函數(shù)中添加了以下代碼:
OSTSSGrp |=bity;
OSTSSTbl[y]|=bitx;
3 應(yīng)用實(shí)例
筆者首先把μC/0S―II移植到開(kāi)發(fā)板上(MCU是意法半導(dǎo)體生產(chǎn)的基于ARM7TDMI核的STR730),然后如2小節(jié)所述對(duì)相關(guān)部分的源代碼進(jìn)行修改,接下來(lái)將優(yōu)先級(jí)調(diào)度法和基于μC/0S―II的時(shí)間片調(diào)度法進(jìn)行比較。為此分別建立了2個(gè)任務(wù)Task_TimeConsuming()、Task_Audio(),任務(wù)的優(yōu)先級(jí)分別是5、6。
由于模擬的耗時(shí)任務(wù)Task_TimeConsuming()是個(gè)死循環(huán)且沒(méi)有調(diào)用OSTimeDly()函數(shù),其優(yōu)先級(jí)又比Task_Audio()高,如果完全按照優(yōu)先級(jí)調(diào)度,系統(tǒng)不會(huì)有聲音輸出,因?yàn)樨?fù)責(zé)聲音控制的任務(wù)Task_Audio一直得不到運(yùn)行。而如果按照時(shí)間片調(diào)度(在os_cfg.h中增加#defineOS_TASK_TIME_SLICE_EN 1),則聲音輸出正常,通過(guò)仿真器在Task_Audio()中設(shè)置斷點(diǎn),程序會(huì)很快停止在斷點(diǎn)處。進(jìn)一步地,依次在Task_TimeConsuming()和Task_Audio()函數(shù)體中設(shè)置斷點(diǎn),分別記錄兩次PC指針停止在斷點(diǎn)處時(shí)看門(mén)狗計(jì)數(shù)器的值WDG_Counterl和WDG_Counter2,可以利用WDG_Counter1和WDG_Counter2的差值估算出任務(wù)Task_Audio前后兩次被調(diào)度的時(shí)間間隔(忽略任務(wù)在切換過(guò)程中的耗時(shí))。經(jīng)過(guò)多次計(jì)算,這個(gè)時(shí)間間隔值的范圍在58~59 ms,而任務(wù)Task_TimeConsuming的時(shí)間片理論值=64一Prio=64―5=59 ms,實(shí)驗(yàn)值與理論值是非常吻合的。
當(dāng)然,這只是簡(jiǎn)單的驗(yàn)證實(shí)驗(yàn)。嚴(yán)格的測(cè)試還需要兼顧信號(hào)量、互斥型信號(hào)量、郵箱及消息隊(duì)列相應(yīng)的PEND、POST函數(shù)以及0STimeDly()函數(shù)調(diào)用。鑒于篇幅關(guān)系,這里就不再贅述了。
結(jié) 語(yǔ)
筆者已經(jīng)成功地把這種基于μC/0S―II的時(shí)間片調(diào)度法運(yùn)用到車(chē)載信息娛樂(lè)系統(tǒng)的開(kāi)發(fā)中。實(shí)踐證明,對(duì)于含有耗時(shí)任務(wù)的系統(tǒng),尤其是在需要嚴(yán)格控制耗時(shí)任務(wù)運(yùn)行時(shí)間長(zhǎng)度的場(chǎng)合,該調(diào)度算法會(huì)有一定的便捷性,也能保證系統(tǒng)的實(shí)時(shí)響應(yīng),而且整個(gè)算法只改動(dòng)了μC/OS―II中的少量代碼;還可以根據(jù)實(shí)際需要調(diào)整各個(gè)任務(wù)的時(shí)間片大小,體現(xiàn)出了算法的實(shí)用性與靈活性。
評(píng)論