μCOSII在Cortex-M3核ARM處理器上的移植
由于微處理器在進(jìn)入中斷時(shí)按堆棧增長方向自動(dòng)順序保存了如下8個(gè)寄存器:xPSR、PC、LR、R12、R3、R2、R1、R0,因此在程序中只須保存另外8個(gè)寄存器,保存順序可以隨意,但注意彈棧時(shí)要按照先進(jìn)后出的方式進(jìn)行。按照本文開頭的假定,任務(wù)總是運(yùn)行在線程模式的特權(quán)方式下且總是使用堆棧指針PSP。而中斷產(chǎn)生后,中斷服務(wù)程序?qū)⑻幱谔幚砟J较?,并且默認(rèn)使用的堆棧指針是MSP。因此在保存堆棧指針的時(shí)候需要保存的是當(dāng)前任務(wù)的PSP。中斷返回前新任務(wù)的堆棧指針需要恢復(fù)到PSP中。中斷返回使用如下指令
MOVrO,#Oxfffffffd
BXr0
其中立即數(shù)#0xfffffffd包含了返回信息,用這兩條指令可以使中斷返回時(shí)使用任務(wù)堆棧指針PSP,返回后任務(wù)處于線程模式且使用任務(wù)堆棧指針PSP。
第三個(gè)匯編語言函數(shù)OSIntCtxSw與OSCtxSw類似。若任務(wù)執(zhí)行過程中產(chǎn)生了中斷,且中斷服務(wù)程序使得一個(gè)比當(dāng)前被中斷的任務(wù)具有更高優(yōu)先級的任務(wù)就緒時(shí),μCOS—II內(nèi)核就會(huì)在中斷返回之前調(diào)用函數(shù)OSIntCtxSw。在此函數(shù)中不需要像任務(wù)級任務(wù)切換函數(shù)那樣保存當(dāng)前任務(wù)狀態(tài),因?yàn)楫?dāng)前任務(wù)已經(jīng)被中斷,在進(jìn)入中斷服務(wù)程序的時(shí)候任務(wù)狀態(tài)已被保存。其源代碼與函數(shù)OSctxSw中保存當(dāng)前任務(wù)堆棧PSP指令以后部分相同,此處不再列出。
第4個(gè)匯編語言函數(shù)OSTickISR是系統(tǒng)時(shí)鐘節(jié)拍的中斷服務(wù)函數(shù)。處理器STM32F103VBT6中有一個(gè)專用系統(tǒng)時(shí)鐘節(jié)拍定時(shí)器SysTick,本移植過程使用此定時(shí)器產(chǎn)生每100 ms一次的時(shí)鐘節(jié)拍中斷。此函數(shù)源代碼如下
3 程序開發(fā)模式討論
傳統(tǒng)應(yīng)用程序開發(fā)模式稱為超循環(huán)模式,即通常主程序是由C語言中的for語句或while語句構(gòu)成的一個(gè)無限循環(huán),程序在此循環(huán)中檢測事件的發(fā)生,從而轉(zhuǎn)向不同的任務(wù)。這種程序開發(fā)模式有兩個(gè)主要的不足之處。首先從程序維護(hù)和可靠性的角度來看,所有任務(wù)都需要程序開發(fā)人員來進(jìn)行全局性的維護(hù),當(dāng)系統(tǒng)變得龐大和復(fù)雜時(shí),任務(wù)的維護(hù)會(huì)變得非常麻煩,同時(shí)程序的可靠性也受到影響。其次,從任務(wù)級響應(yīng)時(shí)間來看,這個(gè)時(shí)間是不確定的,因?yàn)槌绦蛟谘h(huán)體中檢測事件發(fā)生的位置是固定的,但事件的發(fā)生是隨機(jī)的,因此從事件發(fā)生到程序檢測到事件發(fā)生這段時(shí)間也是不確定的。
在基于嵌入式操作系統(tǒng)的應(yīng)用程序開發(fā)過程中,應(yīng)用程序開發(fā)人員只需關(guān)心各個(gè)任務(wù)本身,而任務(wù)調(diào)度由操作系統(tǒng)代勞。以下的例子說明了基于μCOS—II嵌入式操作系統(tǒng)的應(yīng)用程序開發(fā)模式
其中函數(shù)SysInit的作用是根據(jù)具體應(yīng)用對處理器芯片進(jìn)行必要的初始化,例如對系統(tǒng)的時(shí)鐘分配以及通用輸入輸出端口配置。函數(shù)OSInit是μCOS—II操作系統(tǒng)的內(nèi)核初始化程序。第一個(gè)OSTaskCreate函數(shù)創(chuàng)建了任務(wù)Taskl,此任務(wù)的入口地址是Taskl,優(yōu)先級是0。第二個(gè)OSTaskCreate函數(shù)創(chuàng)建了任務(wù)Task2,此任務(wù)的入口地址是Task2,優(yōu)先級是1。函數(shù)OSTaskCrate還會(huì)將其創(chuàng)建的任務(wù)置于就緒態(tài)。文獻(xiàn)敘述了函數(shù)OSTa-skCreate的各個(gè)參數(shù)的含義。函數(shù)OSStart用于啟動(dòng)多任務(wù)調(diào)度。OSTimeDly是μCOS—II內(nèi)核提供的系統(tǒng)調(diào)用函數(shù),用于延時(shí)或定時(shí),這里的參數(shù)5表示延時(shí)5個(gè)時(shí)鐘節(jié)拍。應(yīng)用程序開發(fā)人員需要做的就是通過調(diào)用μCOS—II內(nèi)核提供的任務(wù)創(chuàng)建函數(shù)OSTaskCreate將編寫好的任務(wù)程序交給操作系統(tǒng)管理。
該例中在調(diào)用OSStart后,操作系統(tǒng)發(fā)現(xiàn)任務(wù)Taskl的優(yōu)先級最高,于是操作系統(tǒng)就調(diào)度任務(wù)Taskl使其投入運(yùn)行,而任務(wù)Task2暫時(shí)不能獲得處理器的使用權(quán)。任務(wù)Taskl首先點(diǎn)亮一個(gè)LED,然后延時(shí)一段時(shí)間,當(dāng)運(yùn)行到OSTimeDly處時(shí),該任務(wù)被掛起而處于等待狀態(tài),此時(shí)任務(wù)Task2成為優(yōu)先級最高的就緒態(tài)任務(wù),于是操作系統(tǒng)調(diào)度Task2運(yùn)行。當(dāng)5個(gè)時(shí)鐘節(jié)拍的延時(shí)時(shí)間結(jié)束時(shí),系統(tǒng)時(shí)間節(jié)拍中斷服務(wù)子程序會(huì)重新將任務(wù)Taskl置于就緒狀態(tài),此時(shí)任務(wù)Taskl再一次成為優(yōu)先級最高的就緒態(tài)任務(wù),于是操作系統(tǒng)保存任務(wù)Task2的狀態(tài),并恢復(fù)任務(wù)Taskl的狀態(tài)使其又一次獲得處理器的使用權(quán)。此后程序執(zhí)行過程將重復(fù)上述步驟。可以看到,在這個(gè)例子中的現(xiàn)象是某個(gè)LED燈不停的閃爍。
μCOS—II操作系統(tǒng)內(nèi)核是實(shí)時(shí)可剝奪型的,這意味著在任務(wù)執(zhí)行過程中或中斷服務(wù)子程序中,一旦有一個(gè)新的更高優(yōu)先級的任務(wù)就緒,內(nèi)核將立刻調(diào)度此新任務(wù)運(yùn)行,這說明響應(yīng)任務(wù)的時(shí)間是即刻的、確定的。
綜上所述,基于嵌入式操作系統(tǒng)的應(yīng)用程序開發(fā)過程相對于以往傳統(tǒng)應(yīng)用程序開發(fā)大為簡化而且任務(wù)級響應(yīng)時(shí)間也得到最優(yōu)化。
4 結(jié)束語
通過將移植過程中修改的μCOS—II內(nèi)核代碼與上述例子中的應(yīng)用程序代碼在μVision3集成開發(fā)環(huán)境中編輯整合后進(jìn)行編譯、鏈接并且下載到目標(biāo)硬件平臺(tái)進(jìn)行長時(shí)間觀察,發(fā)現(xiàn)LED不停的閃爍,說明本移植過程是成功的。
評論