中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > uCOSii 在Coldfire MCF52235 上的移植

        uCOSii 在Coldfire MCF52235 上的移植

        作者: 時間:2012-11-21 來源:網絡 收藏

        OS 定義了兩個宏來關閉和使能中斷: OS_ENT ER_CRITICAL( ) 和OS_EXIT _CRIT ICAL( ) 。C/ OS定義了三種方法來關閉和使能中斷, 大多數(shù)情況下選擇第三種方法。

        # define OS_CRITICAL_METH OD # 3

        # define OS_ENTER_CRITICAL( ) { cpu_sr = OS _CPU_

        SR_Save( ) ; } / / 關中斷

        # def ineOS _ EXIT _ CRITICAL( ) { OS _ CPU _ SR_ Resto re

        ( cpu_sr) ; } / / 開中斷

        ( 2) 任務層上下文切換。當C/ OS 調用OS _TASK_SW( ) 時發(fā)生任務層的上下文切換。因為上下

        文切換是根據(jù)處理器的不同而不同的, 所以需要執(zhí)行一個匯編的函數(shù)。在這種情況下, 用TRA P 指令來產

        生一個異常, 用T RAP 指令的優(yōu)點是能使它像發(fā)生了一次中斷一樣。這里用# 14 T RAP, 因為大多數(shù)情況

        下, # 15 TRAP 被調試和監(jiān)控程序保留了。# 14TRAP 定位于VBR+ 0x00B8, 然后跳轉到相應的地址。

        在這個向量處放置OSCtx Sw( ) 的地址。這個函數(shù)聲明在OS_CPU_A. ASM 里。VBR 代表向量基址寄存器,

        包含異常向量表的基址, 程序開始時被初始化為0x00000000, 但是在運行時可以改變。

        # define OS_TASK_SW( ) asm( T RAP # 14; )

        ( 3) 堆棧的增長方向。 的堆棧增長方向是從高地址向低地址, 因此OS _ST K_GROWTH 置

        為1。

        # define OS_STK_GROWTH 1

        2. 3. 2 OS_CPU _C. C 的

        OS_CPU_C. C 里面包含10 個比較簡單的C 語言函數(shù), 一般來說C/ OS 只需要OST askStkInit ( ) 。其他函數(shù)是用來讓用戶在自己的程序里擴展操作系統(tǒng)功能的。如果需要使用這些函數(shù), 需要在OS_CFG. H 里設置OS_CPU _HOOKS_EN 為1。堆棧的初始化: OSTaskStkInit ( ) 雖然是用C 語言編

        寫的, 但它是一個與CPU 硬件相關的函數(shù)。這個函數(shù)功能是初始化任務的堆棧, 由建立任務函數(shù)OSTask

        Create( ) 或擴展地建立任務函數(shù)OSTaskCreateExit ( ) 調用。任務堆棧初始化的實質就是模擬一次中斷, 使堆??雌饋砭拖駝偘l(fā)生過中斷一樣。任務堆棧中保存了任務代碼的起始地址和一些CPU 寄存器的值, 一旦條件滿足, 就可以執(zhí)行該任務。初始化后的任務堆棧結構如圖3所示。

        image

        2. 3. 3 OS_CPU_A. ASM 的

        這個文件包含5 個相當簡單的匯編函數(shù), 因為一般不能用C 語言來保存和恢復寄存器。

        ( 1) OS_CPU_SR_Save( )

        這個函數(shù)是通過保存中斷屏蔽寄存器, 然后關閉中斷來實現(xiàn)OS_CRITICAL_MET HOD # 3 的。當函數(shù)返回時, D0 包含了狀態(tài)寄存器的內容, 里面包含當前的中斷關閉狀態(tài)。這個返回值被調用函數(shù)保存到變量

        cpu_sr 中。

        ( 2) OS_CPU_SR_Restore( )

        這個函數(shù)用來實現(xiàn)恢復中斷屏蔽到調用OS _ENTER_CRITICAL( ) 之前的狀態(tài)。也就是說調用OS_

        ENTER_CRITICAL( ) 之前中斷是關閉的, 那么在OS_EXIT_CRITICAL( ) 之后, 中斷是關閉的。

        ( 3) OSStartHighRdy( )

        這個函數(shù)被OSStar t ( ) 調用來運行優(yōu)先級最高的任務。OSStar t ( ) 設置OSTCBHighRdy 指向優(yōu)先級最高任務的OS _T CB。一旦從OSTaskSwHoo k( ) 返回,就把OSRunning 設為OS_T RU E, 它表明現(xiàn)在RT OS

        將要運行。從最高優(yōu)先級任務的OS_T CB 中恢復堆棧指針, 然后從任務堆棧里取出CPU 寄存器。最后執(zhí)行

        一個RET 指令, 這個指令可以從堆棧中彈出SR 和PC,現(xiàn)在的任務代碼就開始執(zhí)行。

        ( 4) OSCtx Sw( )

        當一個任務不再運行時就會發(fā)生一個任務級的任務切換, 比如任務調用一個延遲10 個時鐘節(jié)拍的函數(shù)。

        這時, C/ OS 需要找出下一個最重要的任務準備去運行。OSCtx Sw ( ) 的功能是保存需要掛起的任務的CPU 寄存器和堆棧, 恢復需要運行任務的CPU 寄存器和堆棧。任務級上下文切換如圖4 所示。

        image

        ( 5) OSIntCtx Sw( )

        當中斷服務函數(shù)完成時, 調用OSIntEx it ( ) 函數(shù)去決定是否有一個更重要的任務比被中斷的任務更需要執(zhí)行。這種情況下, OSIntEx it( ) 決定運行哪個任務, 然后調用OSIntCtx Sw ( ) 。這種情況下, 中斷服務程序已經保存了被中斷任務的CPU 寄存器, 而需要做的只是去恢復新任務的CPU 寄存器。

        2. 3. 4 OS_CPU _I. ASM 的編寫

        如果用到增強的乘法累加單元( eMAC) 模塊, 在上下文切換和中斷時就應該保存和恢復eMAC 寄存器。保

        存和恢復eMAC 寄存器通過兩個宏來實現(xiàn)[ 10] 。代碼如下:

        . macro OS_EM AC_SAVE

        MOVE. L MACSR, D7

        CLR. L D0

        MOVE. L D0, M ACSR

        MOVE. L ACC0, D0

        MOVE. L ACC1, D1

        MOVE. L ACC2, D2

        MOVE. L ACC3, D3

        MOVE. L ACCEXT01, D4

        MOVE. L ACCEXT23, D5

        MOVE. L MASK, D6

        LEA 32( A7) , A7

        MOVEM. L D0D7, ( A7)

        . endm

        . macro OS_EM AC_REST ORE

        MOVEM. L ( A7) , D0D7

        MOVE. L # 0, MACSR

        MOVE. L D0, ACC0

        MOVE. L D1, ACC1

        MOVE. L D2, ACC2

        MOVE. L D3, ACC3

        MOVE. L D4, ACCEXT01

        MOVE. L D5, ACCEXT23

        MOVE. L D6, MASK

        MOVE. L D7, MACSR

        LEA 32( A7) , A7

        . endm

        2. 4 時鐘節(jié)拍的產生

        最后還需要編寫利用片內定時器產生時鐘節(jié)拍的中斷服務程序。C/ OS要求微控制器提供一個簡單的時鐘, 用于任務的延時等功能。在此利用可編程中斷定時器來產生時鐘節(jié)拍中斷。在定時器中斷服務程序中調用OSTimeTick( ) 就產生了系統(tǒng)所需要的時鐘節(jié)拍。C/OS中產生中斷后的中斷處理程序如下所示:

        _BSP_TickISR:

        MOVE. W # 0x2700, SR

        LEA 60( A7) , A7



        評論


        相關推薦

        技術專區(qū)

        關閉