<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 實(shí)時(shí)操作系統μC/OS-Ⅱ在單片機上的移植

實(shí)時(shí)操作系統μC/OS-Ⅱ在單片機上的移植

作者: 時(shí)間:2012-02-17 來(lái)源:網(wǎng)絡(luò ) 收藏

4移植的細節

在 OSTaskStkInit()中,任務(wù)堆棧區的構造特點(diǎn)是的堆棧區由高向低增長(cháng),最高處是任務(wù)的入口參數,接著(zhù)是PC指針和程序狀態(tài)字。如前所述,任務(wù)切換時(shí)要對臨時(shí)寄存器和框架寄存器進(jìn)行保護。明確了任務(wù)堆棧的構造后,編寫(xiě)任務(wù)啟動(dòng)函數(指OSStaart函數)和任務(wù)切換函數(指 OS_TAASK_SW和OSIntCtxSw 函數)的關(guān)鍵是,在得到了最高優(yōu)先級的任務(wù)堆棧指針后,如何按正確的順序出棧,直到PC針。其中OS_TASK_SW()函數在切換任務(wù)之前還要編寫(xiě)對當前任務(wù)的現場(chǎng)進(jìn)行保護的程序,而OSIntCtxSw()不用,因為中斷函數用C寫(xiě)成,而OSIntCtxSw()是在中斷中調用的,因此, 編譯器在進(jìn)中斷時(shí)已自動(dòng)對其保護。同時(shí)還應注意,由于在中斷服務(wù)程序中沒(méi)有定義局部變量,這使得Tasking C編譯器不能對框架寄存器進(jìn)行保護,因此,對這一寄存器的保護應在設計時(shí)自己加上。

  還應注意,在其它中斷服務(wù)程序中,如果沒(méi)有定義局部變量,也應加上對框架寄存器的保護。如果有局部變量,編譯器會(huì )自動(dòng)對框架寄存器進(jìn)行保護。在編寫(xiě) OSIntCtxSw()函數時(shí)應當注意,由于OS-IntCtxSw()是在OSIntExit()中調用的,且在調用OS-IntCtxSw()之前又有一個(gè)關(guān)中斷的操作。因此,筆者采用push a方式來(lái)關(guān)閉中斷,也就是說(shuō),切換到另一高優(yōu)先級的任務(wù)后,會(huì )在當前任務(wù)中留下在OSIntC-txSw()和OSIntExit()調用的返回地址4個(gè)字節的垃圾和pusha關(guān)中斷時(shí)進(jìn)棧的4個(gè)字節垃圾(共8個(gè)字節)。因此,為了保證下次切換到該任務(wù)的正確性,應將SP指針加8,然后再進(jìn)行任務(wù)切換。為加深對此的理解,可以做一假設:如果是24位(3個(gè)字節)尋址能力,在當前任務(wù)中會(huì )留下OSIntCtxSw()和OSIntExit()調用的返回地址的6個(gè)字節的垃圾,如果關(guān)中斷直接采用asmdi方式,而不牽扯到堆棧操作,此時(shí)SP應調整6個(gè)字節而不是8個(gè)字節。

5正確性檢驗

圖3是一個(gè)點(diǎn)燈程序的主任務(wù)流程。其6個(gè)燈中的每一個(gè)點(diǎn)燈操作都是一個(gè)單獨任務(wù)。第一個(gè)燈每?jì)蓚€(gè)時(shí)鐘節拍做一次異或操作。如果LED1每執行2次異或操作向任務(wù)2發(fā)一信號量2,每執行3次異或操作向任務(wù)3發(fā)一信號量3,每執行4次異或操作向任務(wù) 4發(fā)一信號量4,每執行5次異或操作向任務(wù)5發(fā)一信號量5,每執行6次異或操作向任務(wù)6發(fā)一信號量6。那么,任務(wù)2到任務(wù)6在接到相應的信號量時(shí)將對自已控制的燈進(jìn)行一次異或操作。理論分析,LED2到LED6的波形周期分別為L(cháng)ED1的2到6倍。筆者曾用示波器對6個(gè)燈的波形進(jìn)行觀(guān)察,其結果與理論分析相符,同時(shí),在連續運行數天后,沒(méi)有發(fā)現死機和復位,證明移植成功。

參考文獻

1.Labrosse Jean J.MicroC/OS-ⅡThe Real-Time Kernel
2.邵貝貝.uC/OS-Ⅱ-源碼公開(kāi)的實(shí)時(shí)嵌入式 操作系統.北京:中國電力出版社,2001


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 80196KC μC/OS-Ⅱ TaskingC

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>