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