?2 、OS_CPU _C. C 的移植
OS_CPU_C. C 里面包含10 個比較簡單的C 語言函數(shù), 一般來說C/ OS 只需要OST askStkInit ( ) 。其他函數(shù)是用來讓用戶在自己的程序里擴展操作系統(tǒng)功能的。如果需要使用這些函數(shù), 需要在OS_CFG. H 里設(shè)置OS_CPU _HOOKS_EN 為1。堆棧的初始化: OSTaskStkInit ( ) 雖然是用C 語言編
寫的, 但它是一個與CPU 硬件相關(guān)的函數(shù)。這個函數(shù)功能是初始化任務(wù)的堆棧, 由建立任務(wù)函數(shù)OSTask
Create( ) 或擴展地建立任務(wù)函數(shù)OSTaskCreateExit ( ) 調(diào)用。任務(wù)堆棧初始化的實質(zhì)就是模擬一次中斷, 使堆??雌饋砭拖駝偘l(fā)生過中斷一樣。任務(wù)堆棧中保存了任務(wù)代碼的起始地址和一些CPU 寄存器的值, 一旦條件滿足, 就可以執(zhí)行該任務(wù)。初始化后的任務(wù)堆棧結(jié)構(gòu)如圖3所示。
3 、OS_CPU_A. ASM 的移植
這個文件包含5 個相當(dāng)簡單的匯編函數(shù), 因為一般不能用C 語言來保存和恢復(fù)寄存器。
( 1) OS_CPU_SR_Save( )
這個函數(shù)是通過保存中斷屏蔽寄存器, 然后關(guān)閉中斷來實現(xiàn)OS_CRITICAL_MET HOD # 3 的。當(dāng)函數(shù)返回時, D0 包含了狀態(tài)寄存器的內(nèi)容, 里面包含當(dāng)前的中斷關(guān)閉狀態(tài)。這個返回值被調(diào)用函數(shù)保存到變量
cpu_sr 中。
( 2) OS_CPU_SR_Restore( )
這個函數(shù)用來實現(xiàn)恢復(fù)中斷屏蔽到調(diào)用OS _ENTER_CRITICAL( ) 之前的狀態(tài)。也就是說調(diào)用OS_
ENTER_CRITICAL( ) 之前中斷是關(guān)閉的, 那么在OS_EXIT_CRITICAL( ) 之后, 中斷是關(guān)閉的。
( 3) OSStartHighRdy( )
這個函數(shù)被OSStar t ( ) 調(diào)用來運行優(yōu)先級最高的任務(wù)。OSStar t ( ) 設(shè)置OSTCBHighRdy 指向優(yōu)先級最高任務(wù)的OS _T CB。一旦從OSTaskSwHoo k( ) 返回,就把OSRunning 設(shè)為OS_T RU E, 它表明現(xiàn)在RT OS
將要運行。從最高優(yōu)先級任務(wù)的OS_T CB 中恢復(fù)堆棧指針, 然后從任務(wù)堆棧里取出CPU 寄存器。最后執(zhí)行
一個RET 指令, 這個指令可以從堆棧中彈出SR 和PC,現(xiàn)在的任務(wù)代碼就開始執(zhí)行。
( 4) OSCtx Sw( )
當(dāng)一個任務(wù)不再運行時就會發(fā)生一個任務(wù)級的任務(wù)切換, 比如任務(wù)調(diào)用一個延遲10 個時鐘節(jié)拍的函數(shù)。
這時, C/ OS 需要找出下一個最重要的任務(wù)準(zhǔn)備去運行。OSCtx Sw ( ) 的功能是保存需要掛起的任務(wù)的CPU 寄存器和堆棧, 恢復(fù)需要運行任務(wù)的CPU 寄存器和堆棧。任務(wù)級上下文切換如圖4 所示。
( 5) OSINTCtx Sw( )
當(dāng)中斷服務(wù)函數(shù)完成時, 調(diào)用OSIntEx it ( ) 函數(shù)去決定是否有一個更重要的任務(wù)比被中斷的任務(wù)更需要執(zhí)行。這種情況下, OSIntEx it( ) 決定運行哪個任務(wù), 然后調(diào)用OSIntCtx Sw ( ) 。這種情況下, 中斷服務(wù)程序已經(jīng)保存了被中斷任務(wù)的CPU 寄存器, 而需要做的只是去恢復(fù)新任務(wù)的CPU 寄存器。
評論
查看更多