新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > SPARC結構與實時內核的移植

        SPARC結構與實時內核的移植

        作者: 時間:2012-05-17 來源:網絡 收藏

        堆棧

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

        3.功能實現

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

        任務堆棧初始化

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

        任務堆棧的設計可以同中斷堆棧的結構相同。由于任務切換更接近于子線程的調用,所以在進行上下文切換時只需保存PSR的值和當前窗口對應的32個寄存器的值即可。任務堆棧相對中斷堆棧結構更簡單。

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

        任務級切換

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

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

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

        中斷級切換

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

        中斷級切換函數必須對被中斷的任務進行“現場保護”,因為每個中斷函數都有“保護現場”功能,所以這一操作不難實現。此外,中斷級切換函數還需要為新任務分配一組新的,即保存當前所有Used態的窗口寄存器的值到堆棧對應的幀中。可以稱之為Windows_flush,這也是相關的操作。最簡單的flush就是在%WIM中將當前窗口置為無效窗口,通過SAVE語句將當前窗口對應的inputs和locals寄存器的值寫入堆棧。通過循環控制,可以將8個寄存器窗口的值全部保存,并且SAVE指令通過將%o6的值寫入%i6,能自動實現棧幀的切換。在執行 Windows_flush后,當前任務以及其中調用的各線程的堆棧幀才全部被填充,成為一個連續堆棧,這樣才做好了到更高優先級切換的準備。中斷級任務切換的流程圖如圖3。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 溧阳市| 临汾市| 寻乌县| 鄂伦春自治旗| 蓬溪县| 宁津县| 鲜城| 海城市| 双流县| SHOW| 板桥市| 惠安县| 湘乡市| 兴海县| 浪卡子县| 宝坻区| 威宁| 榆林市| 海淀区| 砚山县| 德阳市| 保靖县| 林甸县| 新巴尔虎左旗| 海淀区| 香格里拉县| 贵德县| 玉环县| 阳城县| 彭州市| 镇沅| 泽普县| 太康县| 柏乡县| 江阴市| 信丰县| 商河县| 当阳市| 黔西县| 左云县| 朔州市|