日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > MC68K的C編譯器實現(xiàn)μC/OS-II向MC68K移值解析方案

          MC68K的C編譯器實現(xiàn)μC/OS-II向MC68K移值解析方案

          作者: 時間:2012-06-19 來源:網(wǎng)絡 收藏

          3.OS_CPU32.ASM文件

          μ的移植需要用戶改寫OS_CPU_A.ASM中的4個函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()。

          (1)OSStartHighRdy()函數(shù)

          該函數(shù)由OSStart()函數(shù)調(diào)用,功能是運行優(yōu)先級最高的就緒態(tài)任務。在調(diào)用OSStart() 之前,用戶必須先調(diào)用OSInit(),并且已經(jīng)至少創(chuàng)建了一個任務。為啟動任務,OSStartHighRdy()首先找到當前就緒的優(yōu)先級最高的任務,OSTCBHighRdy中保存有優(yōu)先級最高任務的任務控制塊(TCB)的地址,并從任務的任務控制塊中找到指向堆棧的指針,然后運行指令 MOVEM.L(A7)+,A0-A6/D0-D7,從堆棧中彈出全部寄存器的內(nèi)容,運行RTE中斷返回。由于任務創(chuàng)建時堆棧的結(jié)構(gòu)就是按中斷捕撈堆棧結(jié)構(gòu)初始化的,執(zhí)行RET指令后就切換到了新任務。有關μC/OS- II的任務切換機制,請參考系列計座(3).

          OSStartHighRdy的匯編代碼如下:

          _OSStarHighRdy

          MOVE.L(_OSTCBHighRdy),A1

          ;獲取最高優(yōu)先級就緒任務的TCB地址

          MOVE.L A1,(_OSTCBCur)

          MOVE.L (A1),A7 ;取得堆棧指針

          MOVEM.L (A7)+,A0-A6/D0-D7

          RTE ;中斷返回,切換任務

          (2)OSCtxSw( )函數(shù)

          OSCtxSw( )是一個任務級的任務切換函數(shù)(在任務中調(diào)用,區(qū)別于在中斷程序中調(diào)用的OSIntCtxSw(),在系統(tǒng)上,通過執(zhí)行一條軟中斷指令來任務切換。軟中斷向量指向函數(shù),而該函數(shù)的執(zhí)行結(jié)構(gòu)可能造成系統(tǒng)任務重新調(diào)度(例如,試圖喚醒一個優(yōu)先級更高的任務),則在函數(shù)的末尾會調(diào)用OSSched (),OSSched()將查找當前就緒的優(yōu)先級最高的任務。如果不是當前任務,則判斷是否需要進行任務調(diào)度,再找到該任務控制塊OS_TCB的地址,并將該地址拷貝到變量OSTCBHighRdy中,然后通過寵OS_TASK_SW()執(zhí)行軟中斷,進行任務切換。在此過程中,變量OSTCBCur始終包含一個指向當前運行任務OS_TCB的指針。OSCtxSw()的匯編代碼如下:

          _OSCtxSw

          MOVEM.L A0-A6/D0-D7,-(A7) ;存儲當前任務環(huán)境

          MOVE.L (_OSTCBCur),A1 ;保存當前任務TCB指針

          MOVE.L A7,(A1)

          MOVE.L (_OSTCBHighRdy),A1 ;獲取最高優(yōu)先級就緒任務的TCB地址

          MOVE.L A1,(_OSTCBCur) ;將就緒任務設置為當前運行任務

          MOVE.L (A1),A7 ;取得新任務的堆棧指針

          MOVEM.L (A7)+,A0-A6/D0-D7 ;

          RTE ;中斷返回,切換任務

          (3)OSIntCtxSw()函數(shù)

          在μC/OS -II中,由于中斷的產(chǎn)生可能會引起任務切換,在中斷服務程序的最后會調(diào)用OSICntExit()函數(shù)檢查任務就緒狀態(tài)。如果需要進行任務切換,將調(diào)用 OSIntCtxSw(),所以,OSIntCtxSw()又稱為中斷級的任務切換函數(shù)。由于在調(diào)用OSIntCtxSw()之前已經(jīng)發(fā)生了中斷, OSIntCtxSw()默認CPU寄存器已經(jīng)保存在被中斷任務的堆棧了。OSIntCtxSw()的代碼與OSCtxSw()的大部分相同,不同之處是:第一,由于中斷已經(jīng)發(fā)生,此處不需要再保存CPU寄存器;第二,OSIntCtxSw()需要調(diào)整堆棧指針,去掉堆棧中一些不需要的內(nèi)容,以使堆棧中包含任務的運行環(huán)境。

          _OSIntCtxSw

          ADDA #10,A7 ;忽略掉由于函數(shù)嵌套調(diào)

          ;用而壓入堆棧的內(nèi)容

          MOVE.L (_CSTCBCur),A1 ;在TCB中保存當前

          ;任務的堆棧指針

          MOVE.L A7,(A1)

          MOVE.L (_OSTCBHighRdy),A1

          ;獲取最高優(yōu)先級就緒任務的TCB地址

          MOVE.L A1,(_OSTCBCur) ;將就緒任務設備為當前

          ;運行任務

          MOVE.L (A1),A7 ;取得堆棧指針

          MOVEM.L (A7)+,A0-A6/D0-D7 ;

          RTE ;中斷返回,切換任務

          (4)OSTickISR()函數(shù)

          在μ中,當調(diào)用OSStart()啟動多任務環(huán)境后,時鐘中斷非常重要。在時鐘中斷中處理所有與定時相關的工作,如任務的延時、等待操作等等。在時鐘中斷中將查詢處于等待狀態(tài)的任務,判斷是否延時結(jié)束,以重新進行任務調(diào)度。



          評論


          相關推薦

          技術專區(qū)

          關閉