<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è) > 嵌入式系統 > 設計應用 > SPARC結構與實(shí)時(shí)內核的移植

SPARC結構與實(shí)時(shí)內核的移植

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

堆棧

由于編譯器不能在編譯之初就給外部分配一個(gè)堆棧幀,所以需要根據常規的堆棧幀模擬一個(gè)執行服務(wù)程序的棧結構。由于中斷存在嵌套,即在中斷過(guò)程中發(fā)生更高優(yōu)先級中斷,并且在運行中斷服務(wù)子程序的時(shí)候有可能改變被中斷線(xiàn)程的寄存器值,所以在中斷服務(wù)子程序中有必要進(jìn)行“保護現場(chǎng)”和“恢復現場(chǎng)”。這樣統一考慮,可以將中斷的棧結構設計成圖2所示的結構。其中,除了常規棧結構以外還包括具有控制信息的幾個(gè)寄存器%psr,%pc,%npc, %y,%tbr。和被中斷線(xiàn)程的另外兩組寄存器,global寄存器和inputs寄存器。因為當進(jìn)入中斷服務(wù)子程序時(shí),CWP已經(jīng)減小了1,所以此時(shí)的inputs寄存器應該是被中斷線(xiàn)程的outputs寄存器。%g0寄存器的值永遠為0,所以就不再保存。同時(shí)這樣的結構能盡量使每組寄存器的第0個(gè)寄存器,如%i0,%l0,%g2,%o0的偏移量為8的倍數,可以使用雙字操作來(lái)優(yōu)化寄存器保存與恢復的時(shí)間。

3.功能實(shí)現

對于一個(gè)支持多任務(wù)的實(shí)時(shí)內核,在實(shí)現移植時(shí),最基本的任務(wù)就是用CPU支持的匯編語(yǔ)言實(shí)現的功能,在uC/OS中就是實(shí)現OSCtxSw( )的功能。

任務(wù)堆棧初始化

一般內核在創(chuàng )建新任務(wù)時(shí)都將初始化一個(gè)新的任務(wù)堆棧,其包含有該任務(wù)的入口地址信息,即在函數中需要設置的PC值。設置當前的堆棧指針(SP),當前堆棧幀指針(FP),處理器狀態(tài)寄存器(PSR)中與相關(guān)的值等。

任務(wù)堆棧的設計可以同中斷堆棧的結構相同。由于任務(wù)切換更接近于子線(xiàn)程的調用,所以在進(jìn)行上下文切換時(shí)只需保存PSR的值和當前窗口對應的32個(gè)寄存器的值即可。任務(wù)堆棧相對中斷堆棧結構更簡(jiǎn)單。

當前任務(wù)的SP,FP保存在%sp(%o6)和%fp(%i6)中,并且支持對%sp和%fp的讀寫(xiě)操作,可以將當前的%sp值讀出由 WR指令寫(xiě)入%i6,再將(%sp-0x148)的值寫(xiě)入%o6,這樣通過(guò)分配一個(gè)大小為148H的堆棧幀完成新任務(wù)堆棧指針的初始化。

任務(wù)級切換

uC/OS中任務(wù)切換函數是由軟中斷(TA指令)來(lái)實(shí)現的。不支持對PC的直接操作,但在發(fā)生軟中斷時(shí),CPU會(huì )自動(dòng)將當前PC,NPC 的值寫(xiě)入到%l1,%l2寄存器。而在中斷結束返回時(shí),CPU再自動(dòng)將%l1,%l2的值寫(xiě)入PC,NPC。根據CPU這一操作,可以將任務(wù)的入口地址以及入口地址的下一個(gè)地址分別寫(xiě)入%l1,%l2。這樣在中斷返回后的下一條指令就是要切換任務(wù)的入口地址,從而實(shí)現了任務(wù)切換。

uC/OS中的兩個(gè)變量OSTCBCur和OSTCBHighRdy 分別指向當前任務(wù)和新任務(wù)的任務(wù)控制塊,查考其數據結構可以發(fā)現它們實(shí)際上是兩個(gè)分別為指向當前任務(wù)和新任務(wù)的任務(wù)堆棧的指針。在實(shí)現任務(wù)級切換時(shí),由于當前任務(wù)已經(jīng)執行完畢,沒(méi)有保存當前環(huán)境變量的必要,所以切換函數主要任務(wù)是更新OSTCBCur的值為OSTCBHighRdy,并將更新后的 OSTCBCur所指向的任務(wù)堆棧,即在上一節中初始化好的任務(wù)堆棧中的值寫(xiě)入對應的寄存器,這一操作好比“恢復現場(chǎng)”。

在切換函數執行完,中斷返回時(shí)執行語(yǔ)句“JMP %l1;RETT %l2”將新任務(wù)的入口地址寫(xiě)入到CPU的PC和NPC,完成任務(wù)級切換。

中斷級切換

如果內核為可搶占實(shí)時(shí)內核,任務(wù)調度(通常在中斷中被調用)將高優(yōu)先級的任務(wù)置為有效時(shí),需要在當前中斷中完成任務(wù)的切換,使高優(yōu)先級任務(wù)盡快得到CPU使用權,并在該高優(yōu)先級任務(wù)執行完,且沒(méi)有其它高優(yōu)先任務(wù)被響應時(shí),繼續執行之前被中斷的任務(wù)。

中斷級切換函數必須對被中斷的任務(wù)進(jìn)行“現場(chǎng)保護”,因為每個(gè)中斷函數都有“保護現場(chǎng)”功能,所以這一操作不難實(shí)現。此外,中斷級切換函數還需要為新任務(wù)分配一組新的,即保存當前所有Used態(tài)的窗口寄存器的值到堆棧對應的幀中??梢苑Q(chēng)之為Windows_flush,這也是相關(guān)的操作。最簡(jiǎn)單的flush就是在%WIM中將當前窗口置為無(wú)效窗口,通過(guò)SAVE語(yǔ)句將當前窗口對應的inputs和locals寄存器的值寫(xiě)入堆棧。通過(guò)循環(huán)控制,可以將8個(gè)寄存器窗口的值全部保存,并且SAVE指令通過(guò)將%o6的值寫(xiě)入%i6,能自動(dòng)實(shí)現棧幀的切換。在執行 Windows_flush后,當前任務(wù)以及其中調用的各線(xiàn)程的堆棧幀才全部被填充,成為一個(gè)連續堆棧,這樣才做好了到更高優(yōu)先級切換的準備。中斷級任務(wù)切換的流程圖如圖3。



評論


相關(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>