基于μC/OS-Ⅱ在A(yíng)RM7上移植方法的探討與實(shí)現
includes.h 系統頭文件,整個(gè)實(shí)時(shí)系統程序所需要的文件,包括了內核和用戶(hù)的頭文件,這樣使得用戶(hù)項目中的每個(gè).c文件不用分別去考慮他實(shí)際上需要哪些頭文件。
3.2 與處理器相關(guān)的代碼
這是移植中最關(guān)鍵的部分。內核將應用系統和底層硬件有機地結合成一個(gè)實(shí)時(shí)系統,要使同一個(gè)內核能適用于不同的硬件體系,就需要在內核和硬件之間有一個(gè)中間層,這就是與處理器相關(guān)的代碼,處理器不同,這部分代碼也不同,我們在移植時(shí)需要自己處理這部分代碼,在μc/os中這一部分代碼分成3個(gè)文件:os_cpu.h,os_cpu_a.asm,os_cpu_c.c。
3.2.1 os_cpu.h
包含了用#define定義的與處理器相關(guān)的常量、宏和類(lèi)型定義,具體有系統數據類(lèi)型定義、棧增長(cháng)方向定義、關(guān)中斷和開(kāi)中斷定義、系統軟中斷的定義等。
?。?)不依賴(lài)于編譯的數據類(lèi)型
μc/os-ⅱ不使用c語(yǔ)言中的short,int和long等數據類(lèi)型的定義,因為他們與處理器類(lèi)型有關(guān),隱含著(zhù)不可移植性,代之以移植性強的整數數據類(lèi)型,這樣,既直觀(guān)又可移植。根據ads編譯器的特性,代碼為:
typedef unsigned char boolean;
typedef unsigned char int8u;
typedef signed char int8s;
typedef unsigned short int16u;
typedef signed short int16s;
typedef unsigned int int32u;
typedef signed int int32s;
typedef float fp32;
typedef double fp64;
typedef int32u os_stk;
?。?)使用軟中斷swi做底層接口
因為帶t變量的arm7處理器核具有兩個(gè)指令集,用戶(hù)任務(wù)可以使用兩種處理器模式,為了使底層接口函數與處理器狀態(tài)無(wú)關(guān),同時(shí)在任務(wù)調用相應函數時(shí)不需要知道該函數位置,本例使用軟中斷指令swi作為底層接口,使用不同的功能號區分不同的函數,其swi服務(wù)函數代碼為:
?。?)os_stk_growth
μc/os-ⅱ使用結構常量os_stk_growth指定堆棧的生長(cháng)方式,其代碼為:
#define os_stk_growth 1
3.2.2 os_cpu_c.c
包含了與移植有關(guān)的c函數,包括堆棧的初始化和一些鉤子函數的實(shí)現,但是最重要的是ostaskstkinit()函數,該函數是在用戶(hù)建立任務(wù)時(shí)系統內部自己調用的,用來(lái)對用戶(hù)任務(wù)的堆棧初始化。在arm7體系結構下,任務(wù)堆??臻g由高至低遞減,依次保存著(zhù)pc,lr,r12,…,r1,r0,cpsr的初始化堆棧結構,當用戶(hù)初始化了堆棧,ostaskstkinit()就返回新的堆棧指針stk所指的定地址。ostaskcreate()和ostaskcreateext()會(huì )獲得該地址并將他保存到任務(wù)控制塊tcb中,其他的幾個(gè)鉤子函數必須聲明,但可以不包含任務(wù)代碼,這些鉤子函數在本移植中全為空函數。
3.2.3 os_cpu_a.s
μc/os-ⅱ移植的絕大部分工作都集中在os_cpu_a.s文件的移植上,在這個(gè)文件里,最困難的工作又集中體現在osintctxsw和ostickisr這兩個(gè)函數的實(shí)現上。這是因為這兩個(gè)函數的實(shí)現是和移植者的移植思路以及相關(guān)硬件定時(shí)器、中斷寄存器的設置有關(guān),在實(shí)際的移植工作中,這兩個(gè)地方也是比較容易出錯的地方,這部分需要對處理器的寄存器進(jìn)行操作,所以必須用匯編語(yǔ)言編寫(xiě),包括4個(gè)子函數:osstarthighrdy()、osctxsw()、osintctxsw()、ostickisr()。
評論