新聞中心

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

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

        作者: 時間:2012-06-19 來源:網絡 收藏

        3.OS_CPU32.ASM文件

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

        (1)OSStartHighRdy()函數

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

        OSStartHighRdy的匯編代碼如下:

        _OSStarHighRdy

        MOVE.L(_OSTCBHighRdy),A1

        ;獲取最高優先級就緒任務的TCB地址

        MOVE.L A1,(_OSTCBCur)

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

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

        RTE ;中斷返回,切換任務

        (2)OSCtxSw( )函數

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

        _OSCtxSw

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

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

        MOVE.L A7,(A1)

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

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

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

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

        RTE ;中斷返回,切換任務

        (3)OSIntCtxSw()函數

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

        _OSIntCtxSw

        ADDA #10,A7 ;忽略掉由于函數嵌套調

        ;用而壓入堆棧的內容

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

        ;任務的堆棧指針

        MOVE.L A7,(A1)

        MOVE.L (_OSTCBHighRdy),A1

        ;獲取最高優先級就緒任務的TCB地址

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

        ;運行任務

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

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

        RTE ;中斷返回,切換任務

        (4)OSTickISR()函數

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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 铁岭市| 汝州市| 封开县| 满城县| 清水县| 洛阳市| 邢台县| 郯城县| 宁夏| 昌乐县| 青川县| 西宁市| 隆德县| 延安市| 萨嘎县| 梧州市| 凤阳县| 漳州市| 明光市| 静乐县| 布尔津县| 华亭县| 衡南县| 巩义市| 鄂尔多斯市| 太白县| 宣城市| 定边县| 鸡西市| 宁陕县| 临澧县| 朝阳县| 桂阳县| 读书| 鄄城县| 理塘县| 平遥县| 郎溪县| 天全县| 墨竹工卡县| 克山县|