<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

μC/OS-Ⅱ在MC9S12A64上的移植及應用

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

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

1 uCOS—II內核工作原理

1.1 基本工作原理

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

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

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

(3)最后調用OSSTART()函數開(kāi)始多。

1.2 實(shí)現方式

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

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

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

1.3 共享資源的處理

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

(1)可重入型函數可以被一個(gè)以上的任務(wù)調用,而不必擔心數據的破壞??芍厝胄秃瘮狄话阒皇褂镁植孔兞?,即變量保存在CPU寄存器中或每個(gè)任務(wù)自己的堆棧中。如果使用全局變量,則要把它視為不可重入型函數。所以可重入型函數任何時(shí)候都可以被中斷,一段時(shí)間以后又可以運行,而相應數據不會(huì )丟失。

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

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

2 移植過(guò)程

2.1需要移植的文件

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

(1)μC/OS-II與CPU類(lèi)型無(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也就是說(shuō)這些文件可以直接添加不用修改。

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

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

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

void OSTickISR(void)

{

/* asm{

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

psha

}*/

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

OS_SAVE_SP();

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

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

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

/*asm{

pula

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

nop

rti //中斷返回

}*/

}


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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>