<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          uCOSii 在Coldfire MCF52235 上的移植

          作者: 時(shí)間:2012-11-21 來源:網(wǎng)絡(luò) 收藏

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

          # define OS_CRITICAL_METH OD # 3

          # define OS_ENTER_CRITICAL( ) { cpu_sr = OS _CPU_

          SR_Save( ) ; } / / 關(guān)中斷

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

          ( cpu_sr) ; } / / 開中斷

          ( 2) 任務(wù)層上下文切換。當(dāng)C/ OS 調(diào)用OS _TASK_SW( ) 時(shí)發(fā)生任務(wù)層的上下文切換。因?yàn)樯舷?p>文切換是根據(jù)處理器的不同而不同的, 所以需要執(zhí)行一個(gè)匯編的函數(shù)。在這種情況下, 用TRA P 指令來產(chǎn)

          生一個(gè)異常, 用T RAP 指令的優(yōu)點(diǎn)是能使它像發(fā)生了一次中斷一樣。這里用# 14 T RAP, 因?yàn)榇蠖鄶?shù)情況

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

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

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

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

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

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

          image

          2. 3. 3 OS_CPU_A. ASM 的

          這個(gè)文件包含5 個(gè)相當(dāng)簡單的匯編函數(shù), 因?yàn)橐话悴荒苡肅 語言來保存和恢復(fù)寄存器。

          ( 1) OS_CPU_SR_Save( )

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

          cpu_sr 中。

          ( 2) OS_CPU_SR_Restore( )

          這個(gè)函數(shù)用來實(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( )

          這個(gè)函數(shù)被OSStar t ( ) 調(diào)用來運(yùn)行優(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ùn)行。從最高優(yōu)先級任務(wù)的OS_T CB 中恢復(fù)堆棧指針, 然后從任務(wù)堆棧里取出CPU 寄存器。最后執(zhí)行

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

          ( 4) OSCtx Sw( )

          當(dāng)一個(gè)任務(wù)不再運(yùn)行時(shí)就會(huì)發(fā)生一個(gè)任務(wù)級的任務(wù)切換, 比如任務(wù)調(diào)用一個(gè)延遲10 個(gè)時(shí)鐘節(jié)拍的函數(shù)。

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

          image

          ( 5) OSIntCtx Sw( )

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

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

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

          存和恢復(fù)eMAC 寄存器通過兩個(gè)宏來實(shí)現(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 時(shí)鐘節(jié)拍的產(chǎn)生

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

          _BSP_TickISR:

          MOVE. W # 0x2700, SR

          LEA 60( A7) , A7



          關(guān)鍵詞: 移植 MCF52235 Coldfire uCOSii

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();