- 相關推薦
uC/OS-II在EP7312上的移植
摘要:首先介紹μC/OS-II操作系統的特點,重點分析μC/OS-II在EP7312上的移植方法,介紹μC/OS-II在EP7312中的開發過程。引 言
隨著Internet和后PC時代的到來,嵌入式系統的應用愈來愈廣泛,嵌入式產品在人們的生活中無處不在。今天,嵌入式系統帶來的工業年產值已超過1萬億美元,已經在IT產業中占有很大的比重。
通常,應用程序對嵌入式軟件的基本要求是體積小、執行速度快、具有較好的裁減性和可移植性。嵌入式軟件的靈魂是嵌入式操作系統。在特定的操作系統之上開發應用軟件,可以讓程序開發人員屏蔽掉很多低層硬件細節,使得應用程序調試方便、移植簡單、易維護,同時開發周期也短。目前,實時操作系統很多,如VxWorks、Window CE、pSOS、QNX、LynxOS等等。這些操作系統都具有高可靠性、很強的實時性等特點,但它們都是商業操作系統,價格昂貴,人們往往很難接受。μC/OS-II的出現是對這些商業操作系統的一個很大的沖擊。μC/OS-II是源碼公開的實時操作系統,是一個自由操作系統。程序開發人員可以改寫源代碼,使之符合自己的要求。裁減掉不需要的部分,使操作系統變得小巧、靈活,并且能滿足用戶特定操作系統的需要。
1 μC/OS-II簡介
μC/OS-II并非一個完整的實時操作系統,它只是一個實時內核。μC/OS-II不像其它實時操作系統一樣,提供給用戶的是一個標準的API函數,程序開發人員利用操作系統提供的API函數進行應用程序的開發。要想在μC/OS-II內核上進行應用程序的開發,就需要程序開發人員在實時內核的基礎上建立自己的實時操作系統。首先,把μC/OS-II移植到自己的硬件目標板上,寫出相應的驅動程序以及用戶圖形界面等等;在這些接口函數之上,加上用戶自己的應用程序,就構成了嵌入式軟件。
2 μC/OS-II在EP7312上的移植
μC/OS-II的移植條件是:只要該處理器有堆棧,有CPU內部寄存器入棧、出棧指令;使用的C編譯器支持內嵌匯編(inline assembly)或者該C語言可擴展,可連接匯編模塊,使得關中斷、開中斷能在C語言程序中實現。Cirrus Logic公司生產的EP7312芯片內部采用的是ARM720T處理器,內部有37個寄存器。其中R13通常用作堆棧指針。堆棧尋址是隱含的,堆棧指針所指定的存儲單元就是堆棧的棧頂,堆棧尋址通常有兩種方式向上生長和向下生長。ARM處理器有ARM和Thumb兩種指令集。每種指令集都有豐富的指令可以對堆棧進行操作。堆棧指針指向最后壓入堆棧的有效數據,稱為滿堆棧(full stack);堆棧指針指向下一個數據項放入的空位置,稱為空堆棧(empty stack)。根據堆棧的生長方向不同,可以生成4種類型的堆棧,即滿遞增、空遞增、滿遞減、空遞減。我們所使用的ARM SDT(ARM Software Development Kit)開發系統內含的編譯器,同樣也支持內嵌匯編,所以μC/OS-II完全可以移植到EP7312上。
μC/OS-II核心代碼很小,程序開發人員要把它移植到自己的目標板中只需做少量的工作。圖1是μC/OS-II硬件和軟件的體系結構。
雖然μC/OS-II大部分源代碼是用C語言寫的,但是完成和處理器一些有關的代碼時,還是必須要用匯編語言來實現的。寄存器的讀、寫只能通過匯編語言的存儲和加載指令來實現。要使μC/OS-II能夠正常工作, 處理器必須滿足以下要求:
、 處理器的C編譯器能產生可重入代碼;
② 用C語言可以打開和關閉中斷;
、 處理器支持中斷,并且能夠產生定時中斷(通常在10~100Hz之間);
、 處理器能夠支持容納一定量數據的硬件堆棧;
、 處理器有將堆棧指針和其它寄存器讀出和存儲到堆棧或內存中的指令。
μC/OS-II的移植包括以下幾個部分。
(1)設置與編譯器有關的代碼[OS_CPU.H]
在不同的處理器中有不同的字長,所以必須定義一系列數據類型以確保移植的正確性。另外,在μC/OS-II中,不使用C的short、int和long等數據類型,這些都是和編譯器相關的。下面就是μC/OS-II定義的一部分數據類型。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; /*無符號8位整數 */
typedef signed char INT8S; /*有符號8位整數 */
typedef unsigned int INT16U; /*無符號16位整數 */
typedef signed int INT16S; /*有符號16位整數 */
typedef unsigned long INT32U; /*無符號32位整數 */
typedef signed long INT32S; /*有符號32位整數 */
typedef float FP32; /*單精度浮點數 */
typedef double FP64; /*雙精度浮點數 */
μC/OS-II需要先禁止中斷訪問代碼的臨界區,并且在訪問完畢后重新允許中斷。μC/OS-II定義了兩個宏來禁止和允許中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
#define OS_ENTER_CRITICAL() IRQFIQDE
#define IRQFIQDE __asm
{
mrs r0, CPSR;
stmfd sp!, {r0};
orr r0, r0, #NOINT;
msr CPSR_c, r0;
}
#define OS_EXIT_CRITICAL() IRQF
【uC/OS-II在EP7312上的移植】相關文章:
uC/OS-II內核超時等待機制的分析03-08
μC/OS-II在凌陽單片機SPCE061A上的移植03-18
uC/OS-II任務棧處理的一種改進方法03-18