新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > μC/OS-Ⅱ在MC9S12A64上的移植及應(yīng)用

μC/OS-Ⅱ在MC9S12A64上的移植及應(yīng)用

作者: 時間:2012-05-17 來源:網(wǎng)絡(luò) 收藏

自從嵌入式系統(tǒng)開發(fā)以來,很長時間都采用前后臺系統(tǒng)軟件設(shè)計模式:主程序為一個無限循環(huán),單任務(wù)順序執(zhí)行。通過設(shè)置一個或多個中斷來處理異步事件。這種系統(tǒng)對于簡單的應(yīng)用是可以的,但對于實時性要求比較高的、處理任務(wù)較多的應(yīng)用,就會暴露出實時性差、系統(tǒng)可靠性低、穩(wěn)定性差等缺點。uCOS—II是一種給予優(yōu)先級的搶占式多任務(wù)實時操作系統(tǒng),包含了實時內(nèi)核、任務(wù)管理、時間管理、任務(wù)間通信同步(信號量,郵箱,消息隊列)和內(nèi)存管理等功能。它可以使各個任務(wù)獨立工作,互不干涉,很容易實現(xiàn)準時而且無誤執(zhí)行,使得實時應(yīng)用程序的設(shè)計和擴展變得容易,使得應(yīng)用程序的設(shè)計過程大為減化。而且它內(nèi)核源代碼公開,移植性強,為編程人員提供了很好的一個軟件平臺。

1 uCOS—II內(nèi)核工作原理

1.1 基本工作原理

多任務(wù)系統(tǒng)中,內(nèi)核負責管理各個任務(wù),或者說為每個任務(wù)分配CPU時間,并且負責任務(wù)之間的通訊。內(nèi)核提供的基本服務(wù)是任務(wù)切換。uCOS—II多任務(wù)操作系統(tǒng)工作原理:

(1)首先調(diào)用 OSInit()函數(shù)初始化處理器,操作系統(tǒng),以及完成任務(wù)控制塊(TCB)初始化,TCB優(yōu)先級表初始化,TCB鏈表初始化,事件控制塊(ECB)鏈表初始化,空任務(wù)的創(chuàng)建;

(2)然后創(chuàng)建新任務(wù),每個任務(wù)都被賦予一定的優(yōu)先級,有它自己的一套CPU寄存器和自己的??臻g。

(3)最后調(diào)用OSSTART()函數(shù)開始多。

1.2 實現(xiàn)方式

系統(tǒng)有兩種觸發(fā)方式:中斷級的和任務(wù)級的。

(1)中斷級的調(diào)度是系統(tǒng)多任務(wù)調(diào)度開始后,啟動時鐘節(jié)拍源開始計時,給系統(tǒng)提供周期性的時鐘中斷信號,實現(xiàn)延時和超時確認。當時鐘節(jié)拍中斷發(fā)生時,CPU由中斷向量進入中斷服務(wù)子程序,CPU會自動把當前內(nèi)容的寄存器推入自己的堆棧,然后進行中斷處理,中斷處理完判斷有無任務(wù)延時到期,若有則使該任務(wù)進入就緒態(tài),并把所有進入就緒態(tài)的任務(wù)的優(yōu)先級進行比較,通過中斷級任務(wù)切換函數(shù)將最高優(yōu)先級任務(wù)的狀況從該任務(wù)的棧中裝入CPU寄存器,執(zhí)行該任務(wù)。若沒有別的任務(wù)進入就緒態(tài),則恢復現(xiàn)場繼續(xù)執(zhí)行原任務(wù)。

(2)任務(wù)級的調(diào)度是通過任務(wù)發(fā)軟中斷命令或依靠處理器在任務(wù)執(zhí)行中調(diào)度函數(shù)OSSCHEDULE(),當多任務(wù)內(nèi)核決定運行另外的任務(wù)時,例如任務(wù)要等待信號量或正在執(zhí)行的任務(wù)被掛起時,就需要在此任務(wù)中調(diào)度,找出目前處于就緒態(tài)的優(yōu)先級最高的任務(wù)去執(zhí)行。它保存正在運行任務(wù)的當前狀態(tài),即CPU 寄存器中的全部內(nèi)容。這些內(nèi)容保存在任務(wù)自己的棧區(qū)之中。入棧工作完成以后,就是把下一個將要運行的任務(wù)的當前狀況從該任務(wù)的棧中重新裝入CPU的寄存器,并開始下一個任務(wù)的運行。當沒有任何任務(wù)進入就緒態(tài)時,就去執(zhí)行空任務(wù)OSIDLE()。

1.3 共享資源的處理

可以被一個以上任務(wù)使用的資源叫做共享資源。

(1)可重入型函數(shù)可以被一個以上的任務(wù)調(diào)用,而不必擔心數(shù)據(jù)的破壞??芍厝胄秃瘮?shù)一般只使用局部變量,即變量保存在CPU寄存器中或每個任務(wù)自己的堆棧中。如果使用全局變量,則要把它視為不可重入型函數(shù)。所以可重入型函數(shù)任何時候都可以被中斷,一段時間以后又可以運行,而相應(yīng)數(shù)據(jù)不會丟失。

(2)因為uCOS—II為可剝奪型內(nèi)核,它總是讓就緒態(tài)的高優(yōu)先級的任務(wù)先運行,中斷服務(wù)程序可以搶占CPU,到中斷服務(wù)完成時,內(nèi)核讓此時優(yōu)先級最高的任務(wù)運行(不一定是當時被中斷的任務(wù)),這時不可重入型函數(shù)中的數(shù)據(jù)有可能被破壞。所以應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù),在調(diào)用時,要滿足互斥條件,這一點我們以前的處理方法是調(diào)用函數(shù)之前關(guān)中斷,調(diào)用后再開中斷,但是如果關(guān)中斷的時間太長,會影響整個系統(tǒng)的中斷響應(yīng)時間?,F(xiàn)在可以用互斥型信號量來實現(xiàn)。

(3)任務(wù)要運行下去先要得到信號,想要得到信號量的任務(wù)執(zhí)行等待操作。如果該信號量有效(即信號量值大于0),則信號量值減1,任務(wù)得以繼續(xù)運行。反之,則代表信號已被別的任務(wù)占用,等待信號量的任務(wù)就被掛起并列入等待信號量任務(wù)表。直到信號被當前使用者釋放。

2 移植過程

2.1需要移植的文件

移植工作主要是對源文件的添加和改寫,本文以在上的移植為例,分析μC/OS-II移植的一般方法。

(1)μC/OS-II與CPU類型無關(guān)的代碼:μC/OS-II.H和μC/OS-II.C,其中μC/OS-II.C文件包含以下文件:OS_CORE.C OS_TASK.C OS_TIME.C OS_SEM.C OS_MBOX.C OS_MUTEX.C OS_FLAG.C也就是說這些文件可以直接添加不用修改。

(2)μC/OS-II與CPU類型有關(guān)的代碼OS_CPU.H OS_CPU_A.ASM OS_CPUC.C。也就是說用戶需要根據(jù)單片機的類型將這些函數(shù)修改后才能添加入內(nèi)核。OS_CPU.H文件定義與編譯器相關(guān)的數(shù)據(jù)類型,堆棧的寬度和增長方式以及開關(guān)中斷的宏定義。由于我在移植時使用的是C交叉編譯器,可以使OS_CPU_A.ASM和OS_CPUC.C兩個文件合成為一個 OS_CPUC.C文件。

2.2 OS_CPU_C.C中主要函數(shù)的創(chuàng)建

2.2.1 時鐘節(jié)拍中斷服務(wù)子程序

void OSTickISR(void)

{

/* asm{

ldaa ppage //將每個任務(wù)的存儲頁面寄存器推入堆棧

psha

}*/

OSIntEnter(); //通知μC/OS-II進入時鐘節(jié)拍中斷服務(wù)子程序

OS_SAVE_SP();

CRGFLG =0xEF; //清中斷標志

OSTimeTick(); //給每個用戶任務(wù)控制塊OS_TCB中的時間延時項OSTCBDly減1

OSIntExit(); //通知μC/OS-II時鐘節(jié)拍服務(wù)子程序結(jié)束。

/*asm{

pula

staa ppage //恢復頁面寄存器

nop

rti //中斷返回

}*/

}


上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉