熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

新聞中心

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ù)調用,功能是運行優(yōu)先級最高的就緒態(tài)任務。在調用OSStart() 之前,用戶必須先調用OSInit(),并且已經(jīng)至少創(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( )函數(shù)

OSCtxSw( )是一個任務級的任務切換函數(shù)(在任務中調用,區(qū)別于在中斷程序中調用的OSIntCtxSw(),在系統(tǒng)上,通過執(zhí)行一條軟中斷指令來任務切換。軟中斷向量指向函數(shù),而該函數(shù)的執(zhí)行結構可能造成系統(tǒng)任務重新調度(例如,試圖喚醒一個優(yōu)先級更高的任務),則在函數(shù)的末尾會調用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()函數(shù)

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

_OSIntCtxSw

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

;用而壓入堆棧的內容

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ù)

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



評論


相關推薦

技術專區(qū)

關閉