Uc/os-II的移植
Uc/os-II的移植與FreeRTOS的移植很相似,F(xiàn)reeRTOS 的移植大致由3 個文件實(shí)現(xiàn),一個.h 文件定義編譯器相關(guān)的數(shù)據(jù)類型和中斷處理的宏定義;一個.c 文件實(shí)現(xiàn)任務(wù)的堆棧初始化、系統(tǒng)心跳的管理和任務(wù)切換的請求;一個.s 文件實(shí)現(xiàn)具體的任務(wù)切換。Uc/os-II的移植主要由OS-CPU.H、OS-CPU-C.C以及OS-CPU-A.ASM實(shí)現(xiàn)。
本文引用地址:http://www.ex-cimer.com/article/201609/304842.htm1. INCLUDE.H
INCLUDE.H是一個主頭文件,它出現(xiàn)在每個.C文件的第1行。
可以通過重新編輯INCLUDE.H,增加自己的頭文件,但頭文件必須添加在頭文件列表的最后。
2. OS-CPU.H
OS-CPU.H包括了用|define語句定義的、與處理器相關(guān)的常數(shù)、宏以及類型。
3. OS-CPU-C.C
Uc/os-II的移植要求用戶編寫10個簡單的C函數(shù):(Hook結(jié)尾表示相應(yīng)的接口函數(shù))
(1) OSTaskStkInit( ) 初始化任務(wù)的棧結(jié)構(gòu)
OSTaskCreate( )和OSTaskCreatExt()通過調(diào)用它來初始化任務(wù)的棧結(jié)構(gòu);因此,堆??雌饋砭拖裰袛鄤偘l(fā)生過一樣,所有的寄存器都保存在堆棧中。另外,在初始化堆棧以后,OSTaskStkInit( )應(yīng)當(dāng)返回堆棧指針?biāo)赶虻牡刂贰?/p>
(2) OSTaskCreateHook( )
每當(dāng)添加任務(wù)時,OS-TCBInit()函數(shù)都會調(diào)用OSTaskCreateHook( )
函數(shù),當(dāng)其被調(diào)用時,它會收到指向剛剛建立任務(wù)的任務(wù)控制塊的指針。這樣,它就可以訪問任務(wù)控制塊結(jié)構(gòu)的所有的成員了。若用OSTaskCreate()建立任務(wù),OSTaskCreateHook( )的功能是有限的;但若使用OSTaskCreateExt()建立任務(wù)時,會得到OS-TCB中的擴(kuò)展指針(OSTCBExtPtr)。該指針可用來訪問任務(wù)的附加數(shù)據(jù),如浮點(diǎn)寄存器、MMU寄存器、任務(wù)計數(shù)器、以及調(diào)試信息??梢詸z查OS-TCBInit()看做了哪些工作。
(3) OSTaskDelHook( )
在任務(wù)從就緒列表或等待列表中被刪除后,OSTaskDel()就會調(diào)用OSTaskDelHook( )。當(dāng)調(diào)用其時,它會收到一個指向正在被刪除任務(wù)的任務(wù)控制塊的指針,使它可以訪問任務(wù)控制塊結(jié)構(gòu)的所有的成員。
(4) OSTaskSwHook( )
任務(wù)切換時被調(diào)用,可以直接訪問OSTCBCur和OSTCBHighRdy這2個全局變量。OSTCBCur指向?qū)⒈磺袚Q出去的任務(wù)的任務(wù)控制塊,OSTCBHighRdy指向新任務(wù)的任務(wù)控制塊。
(5) OSTaskIdleHook( )
OSTaskIdle()可調(diào)用OSTaskIdleHook( )實(shí)現(xiàn)CPU的低功耗模式。
(6) OSTaskStatHook( )
每秒都會被統(tǒng)計任務(wù)OSTaskStat()調(diào)用一次,可以用其擴(kuò)展統(tǒng)計任務(wù)功能。例如,可以跟蹤并顯示每個任務(wù)的執(zhí)行時間、每個任務(wù)所用的CPU份額以及每個任務(wù)執(zhí)行的頻率等等。
(7) OSTimeTickHook( )
每個時鐘節(jié)拍都會被OSTimeTick()調(diào)用。
(8) OSInitHookBegin( )
進(jìn)入OSInit()函數(shù)后,OSInitHookBegin( )就立即被調(diào)用,添加其原因在于,這個函數(shù)使得用戶可以將自己特定代碼也放在OSInit()中,使代碼簡潔明了。
(9) OSInitHookEnd( )
與OSInitHookBegin( )相似,只是它在OSInit()函數(shù)返回之前被調(diào)用。
(10)OSTCBInitHook( )
OS-TCBInit()函數(shù)在調(diào)用OSTaskCreateHook( )之前,會先調(diào)用OSTCBInitHook( )。原因在于,用戶可以在OSTCBInitHook( )中做一些與初始化控制塊OS-TCB有關(guān)的處理;在OSTaskCreateHook( )中做一些以初始化任務(wù)有關(guān)的處理。同OSTaskCreateHook( )一樣,OSTCBInitHook( )會收到指向新添加任務(wù)的任務(wù)控制塊的指針。
4.OS-CPU-A.ASM
Uc/os-II的移植要求用戶編寫4個簡單的匯編語言函數(shù):
(1) OSStartHighRdy()
OSStart()函數(shù)調(diào)用OSStartHighRdy()來使就緒任務(wù)中優(yōu)先級最高的任務(wù)開始運(yùn)行。切記,在調(diào)用OSStart()之前,要已經(jīng)建立了至少1個應(yīng)用任務(wù)。
(2) OSCtxSw()
任務(wù)級的切換是通過執(zhí)行軟中斷指令,或者依據(jù)處理器的不同,TRAP(陷阱)指令來實(shí)現(xiàn)的。中斷服務(wù)子程序,陷阱或異常處理的向量地址必須指向OSCtxSw()。
(3) OSIntCtxSw()
OSIntExit()通過調(diào)用OSIntCtxSw(),在ISR中執(zhí)行任務(wù)切換功能。OSIntCtxSw()與OSCtxSw()很相似,區(qū)別只是,因?yàn)镮SR已經(jīng)保存了CPU的寄存器,而不需要再在OSIntCtxSw()函數(shù)中保存。
評論