高博 牛偉 馬振華
【摘要】? ? 任務(wù)調(diào)度是強(qiáng)實(shí)時(shí)嵌入式系統(tǒng)必備的功能,本文利用嵌入式處理器自身的中斷機(jī)制,實(shí)現(xiàn)了一種應(yīng)用于強(qiáng)實(shí)時(shí)嵌入式系統(tǒng)的可搶占式任務(wù)調(diào)度方法。該方法具有實(shí)現(xiàn)簡(jiǎn)單、占用空間小、運(yùn)行效率高、復(fù)雜性低等特點(diǎn),非常適用于資源緊張且對(duì)時(shí)間非常敏感的嵌入式系統(tǒng)。經(jīng)過驗(yàn)證,本方法任務(wù)的周期準(zhǔn)確、運(yùn)行穩(wěn)定可靠,且在多型產(chǎn)品中得到應(yīng)用。
【關(guān)鍵詞】? ? 任務(wù)調(diào)度? ? 嵌入式系統(tǒng)? ? 數(shù)字信號(hào)處理器
引言
隨著科學(xué)技術(shù)的發(fā)展,嵌入式設(shè)備的發(fā)展越來越快,用于工業(yè)控制的嵌入式計(jì)算機(jī)往往都是實(shí)時(shí)系統(tǒng),要求系統(tǒng)中運(yùn)行的各個(gè)任務(wù)都具有很強(qiáng)的實(shí)時(shí)性。一般為了解決嵌入式實(shí)時(shí)系統(tǒng)對(duì)任務(wù)實(shí)時(shí)性的要求,可以向系統(tǒng)中移植實(shí)時(shí)操作系統(tǒng),但其對(duì)系統(tǒng)的存儲(chǔ)資源都有一定的要求,再加上任務(wù)調(diào)度算法的存在,也會(huì)對(duì)系統(tǒng)的性能帶來一定損耗。同時(shí)由于嵌入式實(shí)時(shí)操作系統(tǒng)功能不僅限于任務(wù)調(diào)度,對(duì)于一些簡(jiǎn)單的實(shí)時(shí)系統(tǒng)會(huì)引入很多無用功能,提高軟件的復(fù)雜性,降低系統(tǒng)的安全性。除此之外,嵌入式電子設(shè)備為了降低成本,提高用戶體驗(yàn),越來越注重體積、重量、能耗、價(jià)格等因素,特別對(duì)于輕量級(jí)實(shí)時(shí)系統(tǒng),它們對(duì)資源的要求更加苛刻。本文針對(duì)上述情況,介紹了一種基于CPU內(nèi)部中斷的搶占式實(shí)時(shí)任務(wù)調(diào)度方法,并使用TI公司的TMS320F2812系列數(shù)字處理芯片進(jìn)行實(shí)現(xiàn),該方法還具有簡(jiǎn)單的優(yōu)先級(jí)管理功能。本文的任務(wù)調(diào)度軟件可以大大降低對(duì)存儲(chǔ)空間的需求,降低系統(tǒng)成本,提高運(yùn)行效率,可以用于需要簡(jiǎn)單的任務(wù)調(diào)度功能的實(shí)時(shí)系統(tǒng)。
TMS320F2812是TI公司生產(chǎn)的C2000系列中的一種高性能DSP,其主頻最高可達(dá)150MHz,且外設(shè)資源豐富,性能穩(wěn)定,廣泛應(yīng)用于各種控制領(lǐng)域。
一、實(shí)現(xiàn)原理
1.1任務(wù)調(diào)度原理
嵌入式實(shí)時(shí)系統(tǒng)中往往具有多個(gè)實(shí)時(shí)任務(wù),每個(gè)任務(wù)的執(zhí)行周期均有嚴(yán)格的要求,任務(wù)間也具有優(yōu)先級(jí)的區(qū)分,優(yōu)先級(jí)高的可以搶占優(yōu)先級(jí)低的任務(wù)。上述概念就是嵌入式實(shí)時(shí)系統(tǒng)中的任務(wù)調(diào)度,它的核心操作就是任務(wù)上下文切換。一個(gè)實(shí)時(shí)系統(tǒng)中實(shí)時(shí)周期任務(wù)的運(yùn)行過程示意圖參見圖 1。
圖 1示例中有3個(gè)周期任務(wù),其中高優(yōu)先級(jí)任務(wù)的執(zhí)行周期為t1,中優(yōu)先級(jí)任務(wù)的執(zhí)行周期為t2,低優(yōu)先級(jí)任務(wù)的執(zhí)行周期為t3。時(shí)間段A中,高優(yōu)先級(jí)任務(wù)執(zhí)行完畢,中優(yōu)先級(jí)任務(wù)執(zhí)行,同時(shí)中優(yōu)先級(jí)任務(wù)的執(zhí)行過程被高優(yōu)先級(jí)任務(wù)多次搶占。在時(shí)間段B中,高、中優(yōu)先級(jí)任務(wù)均執(zhí)行完畢,低優(yōu)先級(jí)任務(wù)執(zhí)行,執(zhí)行一段時(shí)間后,又被高優(yōu)先級(jí)任務(wù)搶占。在時(shí)間段C中,各個(gè)優(yōu)先級(jí)的任務(wù)均執(zhí)行完畢,處理器處于空閑狀態(tài),低優(yōu)先級(jí)任務(wù)的執(zhí)行過程被高優(yōu)先級(jí)和中優(yōu)先級(jí)任務(wù)多次搶占。
任務(wù)上下文切換的過程與中斷類似,當(dāng)需要任務(wù)切換時(shí),需要完整地保存正在執(zhí)行任務(wù)的現(xiàn)場(chǎng),即CPU寄存器,并恢復(fù)即將執(zhí)行任務(wù)的現(xiàn)場(chǎng)。除了最基本的任務(wù)切換功能外,還需要一些額外的算法和機(jī)制來支持任務(wù)調(diào)度以及任務(wù)優(yōu)先級(jí)控制。本文提出一種方法,充分利用DSP2812本身的中斷機(jī)制,實(shí)現(xiàn)一種簡(jiǎn)單的任務(wù)優(yōu)先級(jí)控制和任務(wù)切換方法,僅支持搶占式任務(wù)調(diào)度,可以用于輕量級(jí)的嵌入式實(shí)時(shí)系統(tǒng)。
1.2 DSP2812的中斷機(jī)制
使用中斷實(shí)現(xiàn)任務(wù)調(diào)度,就需要把每個(gè)任務(wù)放在一個(gè)獨(dú)立的CPU中斷中,利用中斷觸發(fā)CPU自動(dòng)的上下文切換。同時(shí)為了支持任務(wù)優(yōu)先級(jí)的控制,就要求這些被當(dāng)作任務(wù)的中斷必須為可屏蔽中斷,這就要求CPU的可屏蔽中斷支持以下特性:
1)可以通過軟件觸發(fā);
2)不同的中斷具有不同的優(yōu)先級(jí);
3)中斷支持嵌套,且可以被多次嵌套;
4)滿足以上條件的中斷數(shù)量應(yīng)大于任務(wù)個(gè)數(shù)。
DSP2812具有外設(shè)中斷擴(kuò)展(Peripheral Interrupt Expansion)模塊,當(dāng)使能PIE模塊后,DSP2812的可屏蔽中斷共有114個(gè),其中有96個(gè)都是PIE模塊擴(kuò)展出來的中斷,這些中斷被分為12組,每一組包含8個(gè)中斷源。
DSP2812的可屏蔽中斷首先受到全局中斷標(biāo)志INTM的控制。由于PIE模塊的12個(gè)組分別連接到CPU的INT1到INT12,每一組的中斷使能受到中斷使能寄存器IER對(duì)應(yīng)位的控制。最后每一組內(nèi)8個(gè)中斷又受到對(duì)應(yīng)組的PIE模塊中斷使能寄存器PIEIERx的控制。DSP2812的PIE模塊中每一個(gè)中斷均支持軟件觸發(fā),以通過軟件觸發(fā)某個(gè)PIEx.y的中斷為例,首先需要使能INTM,然后在IER中使能INTx,在PIEIERx中使能INTy,最后通過向PIEIFRx的INTy寫1,觸發(fā)PIEx.y中斷。
利用中斷實(shí)現(xiàn)多任務(wù)的調(diào)度,每次任務(wù)切換就是一次中斷嵌套,對(duì)于DSP2812來說,它的C語(yǔ)言運(yùn)行環(huán)境在進(jìn)入中斷服務(wù)程序后,會(huì)自動(dòng)禁止全局中斷,如果要允許中斷嵌套,則需要手動(dòng)使能全局中斷。這種機(jī)制恰好方便了使用中斷實(shí)現(xiàn)任務(wù)調(diào)度,在進(jìn)入中斷到手動(dòng)使能全局中斷的這段時(shí)間內(nèi),CPU不會(huì)被其他任何可屏蔽中斷打斷,也就是這段代碼處于臨界區(qū)。這段區(qū)域就可以使能比正在執(zhí)行任務(wù)優(yōu)先級(jí)高任務(wù)的中斷,禁止比正在執(zhí)行任務(wù)優(yōu)先級(jí)低任務(wù)的中斷,從而實(shí)現(xiàn)優(yōu)先級(jí)控制。而中斷現(xiàn)場(chǎng)的保存和恢復(fù),也就是任務(wù)上下文切換由CPU的中斷機(jī)制自動(dòng)完成,同時(shí)如果DSP2812的C語(yǔ)言運(yùn)行環(huán)境檢測(cè)到中斷服務(wù)程序中調(diào)用了函數(shù),則會(huì)在進(jìn)入中斷時(shí)自動(dòng)保存所有寄存器,這種機(jī)制極大地簡(jiǎn)化了任務(wù)上下文切換的過程。
二、軟件實(shí)現(xiàn)
下面以一個(gè)強(qiáng)實(shí)時(shí)系統(tǒng)為例,說明本文方法的實(shí)現(xiàn)過程。該系統(tǒng)有1個(gè)外部中斷,接到XINT1上,該中斷在PIE模塊中的中斷源為PIE1.4。該系統(tǒng)共有2個(gè)強(qiáng)實(shí)時(shí)周期任務(wù),執(zhí)行周期分別為20ms和100ms,分別命名為TaskA和TaskB。
2.1中斷配置
具有實(shí)時(shí)任務(wù)的系統(tǒng)中必須有一個(gè)時(shí)基,一般來源于CPU定時(shí)器,本例中使用DSP2812的定時(shí)器0作為時(shí)基,時(shí)基中斷的觸發(fā)頻率為1kHz,即每隔1ms觸發(fā)一次。定時(shí)器0的中斷源為PIE1.7。
此時(shí)PIE組1的中斷已經(jīng)使用了2個(gè),為了方便使用,本例將2個(gè)任務(wù)均放在未使用的PIE組2中,使用PIE2.1和PIE2.2。
根據(jù)上述中斷的要求,具體中斷配置如下:
1)使能IER1和IER2,使能PIEIER1.4、PIEIER1.7以及PIEIER2.1和PIEIER2.2。
2)軟件中控制中斷優(yōu)先級(jí)從高到低的順序?yàn)镻IE1.4、PIE1.7、PIE2.1和PIE2.2。
2.2定時(shí)器中斷服務(wù)程序
定時(shí)器中斷服務(wù)程序就是時(shí)基的處理程序,該程序需要實(shí)現(xiàn)每個(gè)任務(wù)的調(diào)度。同時(shí)時(shí)基中斷不能被任務(wù)打斷,DSP2812處理器自身具有執(zhí)行中斷時(shí)默認(rèn)關(guān)閉可屏蔽中斷的功能。定時(shí)器中斷服務(wù)程序要完成的操作如下:
1)根據(jù)每個(gè)任務(wù)的運(yùn)行周期,利用定時(shí)器中斷次數(shù)計(jì)數(shù)器,周期性設(shè)置每個(gè)任務(wù)對(duì)應(yīng)的PIEIFR寄存器。對(duì)于本例,每隔20次中斷將PIEIFR2.1置位;每隔100次中斷將PIEIFR2.2置位。
2)為了防止任務(wù)函數(shù)執(zhí)行超時(shí)造成重入,每次置位IFR時(shí),需要預(yù)先判斷對(duì)應(yīng)的任務(wù)是否執(zhí)行完畢,可以在任務(wù)的中斷服務(wù)程序中,通過標(biāo)志位實(shí)現(xiàn)。如果對(duì)應(yīng)任務(wù)未執(zhí)行完,需要設(shè)置超時(shí)標(biāo)志,不能設(shè)置置相應(yīng)的PIEIFR寄存器。
3)累加定時(shí)器中斷次數(shù)計(jì)數(shù)器,同時(shí)置位定時(shí)器的PIEACK寄存器,以清除定時(shí)器中斷。
2.3任務(wù)中斷服務(wù)程序
為了實(shí)現(xiàn)可搶占任務(wù)調(diào)度,每個(gè)任務(wù)中都可以被比自身優(yōu)先級(jí)高的任務(wù)以及定時(shí)中斷打斷,因此任務(wù)需要允許中斷嵌套。同時(shí)開啟中斷嵌套后,需要手動(dòng)控制可以打斷當(dāng)前任務(wù)中斷的使能。同時(shí)除了任務(wù)以外的其他中斷應(yīng)當(dāng)保持使能。每個(gè)任務(wù)中斷服務(wù)程序需要完成的操作如下:
1)設(shè)置任務(wù)開始執(zhí)行標(biāo)志,以便定時(shí)器中斷服務(wù)程序判斷任務(wù)是否超時(shí)。
2)將IER和PIEIER寄存器設(shè)置為使能比自己優(yōu)先級(jí)高任務(wù)的中斷,以及所有非任務(wù)中斷。例如當(dāng)運(yùn)行最高優(yōu)先級(jí)任務(wù)TaskA時(shí),不允許其他任務(wù)搶占,但允許被中斷搶占。此時(shí)IER需要使能第1位、禁止第2位,而PIEIER1保持不變,PIEIER2需要將第1位和第2位均禁止斷;當(dāng)運(yùn)行TaskB時(shí),要允許TaskA搶占,還要允許中斷搶占,此時(shí)IER使能第1位和第2位,PIEIER1保持不變,同時(shí)PIEIER2禁止第2位使能第1位。
3)使能全局中斷,并執(zhí)行任務(wù),過程中允許所有中斷和比當(dāng)前任務(wù)優(yōu)先級(jí)高的任務(wù),打斷當(dāng)前任務(wù)的執(zhí)行。
4)禁止全局中斷,將IER和PIEIER寄存器恢復(fù)為任務(wù)中斷前的狀態(tài)。
5)清除任務(wù)開始執(zhí)行標(biāo)志并執(zhí)行中斷返回。
三、方法驗(yàn)證
采用第3節(jié)的示例對(duì)本文提出的任務(wù)調(diào)度方法進(jìn)行驗(yàn)證,每個(gè)任務(wù)均執(zhí)行耗費(fèi)一定時(shí)間的操作,分別測(cè)量每個(gè)任務(wù)的執(zhí)行周期,結(jié)果參見圖 2。
圖 2中,上面的波形表示TaskA即20ms任務(wù)的執(zhí)行情況,下面的波形表示TaskB即100ms任務(wù)的執(zhí)行情況。20ms任務(wù)的執(zhí)行時(shí)間大約為4ms,其中被外部中斷打斷時(shí)大約多執(zhí)行1ms。100ms任務(wù)的執(zhí)行時(shí)間大約為50ms,其中被20ms打斷5次,大約需要20ms,任務(wù)本身的執(zhí)行也會(huì)被外部中斷打斷。本方法任務(wù)運(yùn)行周期穩(wěn)定,能夠?qū)崿F(xiàn)實(shí)時(shí)任務(wù)調(diào)度。
四、結(jié)束語(yǔ)
本文提出的任務(wù)調(diào)度方法利用了DSP本身的中斷機(jī)制,任務(wù)調(diào)度周期準(zhǔn)確且可搶占,能夠滿足嵌入式強(qiáng)實(shí)時(shí)系統(tǒng)的要求。同時(shí)其代碼量非常小,幾乎不占用額外的運(yùn)行RAM,且任務(wù)切換完全使用CPU本身的中斷自動(dòng)切換機(jī)制,具有安全性高、效率高的優(yōu)點(diǎn)。