在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 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()函數調用,功能是運行優(yōu)先級最高的就緒態(tài)任務。在調用OSStart() 之前,用戶必須先調用OSInit(),并且已經至少創(chuàng)建了一個任務。為啟動任務,OSStartHighRdy()首先找到當前就緒的優(yōu)先級最高的任務,OSTCBHighRdy中保存有優(yōu)先級最高任務的任務控制塊(TCB)的地址,并從任務的任務控制塊中找到指向堆棧的指針,然后運行指令 MOVEM.L(A7)+,A0-A6/D0-D7,從堆棧中彈出全部寄存器的內容,運行RTE中斷返回。由于任務創(chuàng)建時堆棧的結構就是按中斷捕撈堆棧結構初始化的,執(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( )函數

            OSCtxSw( )是一個任務級的任務切換函數(在任務中調用,區(qū)別于在中斷程序中調用的OSIntCtxSw(),在系統(tǒng)上,通過執(zhí)行一條軟中斷指令來任務切換。軟中斷向量指向函數,而該函數的執(zhí)行結構可能造成系統(tǒng)任務重新調度(例如,試圖喚醒一個優(yōu)先級更高的任務),則在函數的末尾會調用OSSched (),OSSched()將查找當前就緒的優(yōu)先級最高的任務。如果不是當前任務,則判斷是否需要進行任務調度,再找到該任務控制塊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()函數

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

            _OSIntCtxSw

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

            ;用而壓入堆棧的內容

            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()函數

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



            評論


            相關推薦

            技術專區(qū)

            關閉