新聞中心

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

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

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

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

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

1.1 基本工作原理

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

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

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

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

1.2 實(shí)現(xiàn)方式

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

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

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

1.3 共享資源的處理

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

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

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

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

2 移植過程

2.1需要移植的文件

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

(1)μC/OS-II與CPU類型無(wú)關(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ù)單片機(jī)的類型將這些函數(shù)修改后才能添加入內(nèi)核。OS_CPU.H文件定義與編譯器相關(guān)的數(shù)據(jù)類型,堆棧的寬度和增長(zhǎng)方式以及開關(guān)中斷的宏定義。由于我在移植時(shí)使用的是C交叉編譯器,可以使OS_CPU_A.ASM和OS_CPUC.C兩個(gè)文件合成為一個(gè) OS_CPUC.C文件。

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

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

void OSTickISR(void)

{

/* asm{

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

psha

}*/

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

OS_SAVE_SP();

CRGFLG =0xEF; //清中斷標(biāo)志

OSTimeTick(); //給每個(gè)用戶任務(wù)控制塊OS_TCB中的時(shí)間延時(shí)項(xiàng)OSTCBDly減1

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

/*asm{

pula

staa ppage //恢復(fù)頁(yè)面寄存器

nop

rti //中斷返回

}*/

}


上一頁(yè) 1 2 3 下一頁(yè)

評(píng)論


相關(guān)推薦

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

關(guān)閉