μCOSII在基于Cortex-M3核的ARM處理器上的移植
BX r0;直接跳轉(zhuǎn)到第一個(gè)任務(wù)的入口地址
第二個(gè)匯編語言函數(shù)OSCtxSw是任務(wù)級(jí)的任務(wù)切換函數(shù)。若在任務(wù)執(zhí)行過程中有一個(gè)比當(dāng)前任務(wù)優(yōu)先級(jí)更高的任務(wù)進(jìn)入就緒態(tài),μCOS―II內(nèi)核就會(huì)啟動(dòng)OSCtxSw進(jìn)行任務(wù)切換。該函數(shù)會(huì)保存當(dāng)前任務(wù)狀態(tài),然后恢復(fù)那個(gè)優(yōu)先級(jí)更高的任務(wù)狀態(tài),使之投入運(yùn)行。前述的宏定義#defineOS_TASK_SW()OS_SVC()中的OS_SVC()包含了SVC軟件中斷指令,此中斷的中斷向量應(yīng)該設(shè)為函數(shù)OSCtxSw的入口地址,即OSCtxSw是SVC指令產(chǎn)生中斷的中斷服務(wù)程序,其源代碼如下
由于微處理器在進(jìn)入中斷時(shí)按堆棧增長(zhǎng)方向自動(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)先級(jí)的任務(wù)就緒時(shí),μCOS―II內(nèi)核就會(huì)在中斷返回之前調(diào)用函數(shù)OSIntCtxSw。在此函數(shù)中不需要像任務(wù)級(jí)任務(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)中檢測(cè)事件的發(fā)生,從而轉(zhuǎn)向不同的任務(wù)。這種程序開發(fā)模式有兩個(gè)主要的不足之處。首先從程序維護(hù)和可靠性的角度來看,所有任務(wù)都需要程序開發(fā)人員來進(jìn)行全局性的維護(hù),當(dāng)系統(tǒng)變得龐大和復(fù)雜時(shí),任務(wù)的維護(hù)會(huì)變得非常麻煩,同時(shí)程序的可靠性也受到影響。其次,從任務(wù)級(jí)響應(yīng)時(shí)間來看,這個(gè)時(shí)間是不確定的,因?yàn)槌绦蛟谘h(huán)體中檢測(cè)事件發(fā)生的位置是固定的,但事件的發(fā)生是隨機(jī)的,因此從事件發(fā)生到程序檢測(cè)到事件發(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)用對(duì)處理器芯片進(jìn)行必要的初始化,例如對(duì)系統(tǒng)的時(shí)鐘分配以及通用輸入輸出端口配置。函數(shù)OSInit是μCOS―II操作系統(tǒng)的內(nèi)核初始化程序。第一個(gè)OSTaskCreate函數(shù)創(chuàng)建了任務(wù)Taskl,此任務(wù)的入口地址是Taskl,優(yōu)先級(jí)是0。第二個(gè)OSTaskCreate函數(shù)創(chuàng)建了任務(wù)Task2,此任務(wù)的入口地址是Task2,優(yōu)先級(jí)是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)管理。
評(píng)論