a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

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

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

作者: 時間:2012-05-17 來源:網絡 收藏

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

1 uCOS—II內核工作原理

1.1 基本工作原理

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

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

(2)然后創建新任務,每個任務都被賦予一定的優先級,有它自己的一套CPU寄存器和自己的棧空間。

(3)最后調用OSSTART()函數開始多

1.2 實現方式

系統有兩種觸發方式:中斷級的和任務級的。

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

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

1.3 共享資源的處理

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

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

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

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

2 移植過程

2.1需要移植的文件

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

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

2.2 OS_CPU_C.C中主要函數的創建

2.2.1 時鐘節拍中斷服務子程序

void OSTickISR(void)

{

/* asm{

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

psha

}*/

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

OS_SAVE_SP();

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

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

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

/*asm{

pula

staa ppage //恢復頁面寄存器

nop

rti //中斷返回

}*/

}


上一頁 1 2 3 下一頁

評論


相關推薦

技術專區

關閉