久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > Uc/os-II的移植

Uc/os-II的移植

作者: 時間:2016-09-12 來源:網絡 收藏

Uc/os-II的移植與FreeRTOS的移植很相似,FreeRTOS 的移植大致由3 個文件實現,一個.h 文件定義編譯器相關的數據類型和中斷處理的宏定義;一個.c 文件實現任務的堆棧初始化、系統心跳的管理和任務切換的請求;一個.s 文件實現具體的任務切換。Uc/os-II的移植主要由OS-CPU.H、OS-CPU-C.C以及OS-CPU-A.ASM實現。

本文引用地址:http://cqxgywz.com/article/201609/304842.htm

1. INCLUDE.H

INCLUDE.H是一個主頭文件,它出現在每個.C文件的第1行。

可以通過重新編輯INCLUDE.H,增加自己的頭文件,但頭文件必須添加在頭文件列表的最后。

2. OS-CPU.H

OS-CPU.H包括了用|define語句定義的、與處理器相關的常數、宏以及類型。

3. OS-CPU-C.C

Uc/os-II的移植要求用戶編寫10個簡單的C函數:(Hook結尾表示相應的接口函數)

(1) OSTaskStkInit( ) 初始化任務的棧結構

OSTaskCreate( )和OSTaskCreatExt()通過調用它來初始化任務的棧結構;因此,堆棧看起來就像中斷剛發生過一樣,所有的寄存器都保存在堆棧中。另外,在初始化堆棧以后,OSTaskStkInit( )應當返回堆棧指針所指向的地址。

(2) OSTaskCreateHook( )

每當添加任務時,OS-TCBInit()函數都會調用OSTaskCreateHook( )

函數,當其被調用時,它會收到指向剛剛建立任務的任務控制塊的指針。這樣,它就可以訪問任務控制塊結構的所有的成員了。若用OSTaskCreate()建立任務,OSTaskCreateHook( )的功能是有限的;但若使用OSTaskCreateExt()建立任務時,會得到OS-TCB中的擴展指針(OSTCBExtPtr)。該指針可用來訪問任務的附加數據,如浮點寄存器、MMU寄存器、任務計數器、以及調試信息。可以檢查OS-TCBInit()看做了哪些工作。

(3) OSTaskDelHook( )

在任務從就緒列表或等待列表中被刪除后,OSTaskDel()就會調用OSTaskDelHook( )。當調用其時,它會收到一個指向正在被刪除任務的任務控制塊的指針,使它可以訪問任務控制塊結構的所有的成員。

(4) OSTaskSwHook( )

任務切換時被調用,可以直接訪問OSTCBCur和OSTCBHighRdy這2個全局變量。OSTCBCur指向將被切換出去的任務的任務控制塊,OSTCBHighRdy指向新任務的任務控制塊。

(5) OSTaskIdleHook( )

OSTaskIdle()可調用OSTaskIdleHook( )實現CPU的低功耗模式。

(6) OSTaskStatHook( )

每秒都會被統計任務OSTaskStat()調用一次,可以用其擴展統計任務功能。例如,可以跟蹤并顯示每個任務的執行時間、每個任務所用的CPU份額以及每個任務執行的頻率等等。

(7) OSTimeTickHook( )

每個時鐘節拍都會被OSTimeTick()調用。

(8) OSInitHookBegin( )

進入OSInit()函數后,OSInitHookBegin( )就立即被調用,添加其原因在于,這個函數使得用戶可以將自己特定代碼也放在OSInit()中,使代碼簡潔明了。

(9) OSInitHookEnd( )

與OSInitHookBegin( )相似,只是它在OSInit()函數返回之前被調用。

(10)OSTCBInitHook( )

OS-TCBInit()函數在調用OSTaskCreateHook( )之前,會先調用OSTCBInitHook( )。原因在于,用戶可以在OSTCBInitHook( )中做一些與初始化控制塊OS-TCB有關的處理;在OSTaskCreateHook( )中做一些以初始化任務有關的處理。同OSTaskCreateHook( )一樣,OSTCBInitHook( )會收到指向新添加任務的任務控制塊的指針。

4.OS-CPU-A.ASM

Uc/os-II的移植要求用戶編寫4個簡單的匯編語言函數:

(1) OSStartHighRdy()

OSStart()函數調用OSStartHighRdy()來使就緒任務中優先級最高的任務開始運行。切記,在調用OSStart()之前,要已經建立了至少1個應用任務。

(2) OSCtxSw()

任務級的切換是通過執行軟中斷指令,或者依據處理器的不同,TRAP(陷阱)指令來實現的。中斷服務子程序,陷阱或異常處理的向量地址必須指向OSCtxSw()。

(3) OSIntCtxSw()

OSIntExit()通過調用OSIntCtxSw(),在ISR中執行任務切換功能。OSIntCtxSw()與OSCtxSw()很相似,區別只是,因為ISR已經保存了CPU的寄存器,而不需要再在OSIntCtxSw()函數中保存。



關鍵詞:

評論


相關推薦

技術專區

關閉