μC/OS II 移植

μC/OS II 移植步驟

一.設置與處理器及編譯器相關的代碼[OS_CPU.H]

不同的編譯器會使用不同的字節長度來表示同一數據類型,所以要定義一系列數據類型以確保移植的正確性。下面是μ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;/*雙精度浮點數*/
typedef unsigned int OS_STK;/*堆棧入口寬度*/
typedef unsigned int OS_CPU_SR;/*寄存器寬度*/
μC/OS II需要先關中斷再訪問臨界區的代碼,並且在訪問完後重新允許中斷。μC/OS II定義了兩個宏來禁止和允許中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),本移植實現這兩個宏的彙編代碼。
#define OS_ENTER_CRITICAL()(cpu_sr=OSCPUSaveSR())/*Disable interrupts*/
#define OS_EXIT_CRITICAL()(OSCPURestoreSR(cpu_sr))/*Enable interrupts*/
EXPORT OSCPUSaveSR  OSCPUSaveSR  mrs r1,cpsr  mov r0,r1  orr r1,r1,#0xc0  msr cpsr_cxsf,r1  mov pc,lr
EXPORT OSCPURestoreSR  OSCPURestoreSR  msr cpsr_cxsf,r0  mov pc,lr

二.用C語言實現與處理器任務相關的函數[OS_CPU_C.C]

OSTaskStkInit()  OSTaskCreateHook()  OSTaskDelHook()  OSTaskSwHook()  OSTaskStatHook() OSTimeTickHook()  實際需要修改的只有OSTaskStkInit()函數,其他五個函數需要聲明,但不一定有實際內容。這五個函數都是用戶定義的,所以OS_CPU_C.C中沒有給出代碼。如果需要使用這些函數,可以將文件OS_CFG.H中的#define constant OS_CPU_HOOKS_EN設爲1,設爲0表示不使用這些函數。  OSTaskStkInit()函數由OSTaskCreate()或OSTaskCreateExt()調用,需要傳遞的參數是任務代碼的起始地址、參數指針(pdata)、任務堆棧頂端的地址和任務的優先級,用來初始化任務的堆棧,初始狀態的堆棧模擬發生一次中斷後的堆棧結構。堆棧初始化工作結束後,OSTaskStkInit()返回新的堆棧棧頂指針,OSTaskCreate()或OSTaskCreateExt()將指針保存在任務的OS_TCB中。調用OSTaskStkInit()給任務做一個初始的任務上下文堆棧

三.處理器相關部分彙編實現、

整個μC/OS II移植實現中,只需要提供一個彙編語言文件,提供幾個必須由彙編才能實現的函數。

a)OSStartHighRdy()  該函數在OSStart()多任務啓動之後,負責從最高優先級任務的TCB控制塊中獲得該任務的堆棧指針sp,通過sp依次將CPU現場恢復,此時系統就將控制權交給用戶創建的該任務的進程,直到該任務被阻塞或者被其他更高優先級的任務搶佔了CPU。該函數僅僅在多任務啓動時被執行一次,用來啓動第一個,也就是最高優先級的任務執行。

b)OSCtxSw()  該函數是任務級的上下文切換函數,在任務因爲被阻塞而主動請求與CPU調度時執行,主要工作是先將當前任務的CPU現場保存到該任務堆棧中,然後獲得最高優先級任務的堆棧指針,從該堆棧中恢復此任務的CPU現場,使之繼續執行,從而完成一次任務切換。

C)OSIntExit()  該函數是中斷級的任務切換函數,在時鐘中斷ISR中發現有高優先級任務在等待時,需要在中斷退出後不返回被中斷的任務,而是直接調度就緒的高優先級任務執行。其目的在於能夠儘快讓高優先級的任務得到響應,保證系統的實時性能。

d)OSTickISR()  該函數是時鐘中斷處理函數,主要任務是負責處理時鐘中斷,調用系統實現的OSTimeTick函數,如果有等待時鐘信號的高優先級任務,則需要在中斷級別上調度其執行。另外兩個相關函數是OSIntEnter()和OSIntExit(),都需要在ISR中執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章