<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • uC/OS-II任務棧處理的一種改進方法

    時間:2024-10-27 22:36:30 理工畢業論文 我要投稿
    • 相關推薦

    uC/OS-II任務棧處理的一種改進方法

    摘要:在μC/OS-II內核中,各個不同的任務使用獨立的堆棧空間,堆棧的大小按每個任務所需要的最大堆棧深度來定義,這種方法可能會造成堆棧空間浪費。本文敘述如何在RTOS中多個任務共用連續存儲空間作為任務棧的方法,并詳細比較二者的優缺點和適用性。

    關于μC/OS-II這個實時內核及其應用已經有很多文章介紹了,對于學習RTOS的人來說,這個系統是很好的學習起點。雖然文獻[1]的源代碼沒有行號和函數名交叉索引表等,給源代碼閱讀造成一些困難(可使用BC31的grep查找功能,提高閱讀效率),好在代碼不是很長,前面又有詳細的中文說明,對于有一定X86匯編和C語言基礎的人來說,仍然可以在不長的時間內掌握。

    μC/OS-II內核是一個搶先式內核,可以進行任務間切換,也可以讓一個任務在得不到某個資源時休眠一定時間后再繼續運行;提供了用于共享資源管理的信號燈,用于進程通信的消息隊列和郵箱,甚至提供了存儲器管理機制,一個比較全面的系統。

    μC/OS-II內核有些地方仍然值得改進,比如該系統不支持時間片調度。如果有一個任務中一段死循環代碼(或者條件循環代碼),代碼就會永遠(或長時間)在此處執行,調度程序無法控制,其它任務也就是不到及時執行。這種搶先式實際上和非搶先式系統存在著同樣問題。當然,如果這種代碼不一個BUG,問題是可以解決的,在不提供時間片調度的搶先式系統中,一般采取信號燈,或者任務主動休眠的方法(對于μC/OS-II,很容易改造成支持時間片調度,只要在定時中斷服務程序調用OSIntCtxSw()函數即可);非搶先式系統一般采取有限狀態機方法,不使用這種耗時很長的循環代碼。不過,無論如何,對RTOS的使用者來說,這畢竟會使得任務函數的編碼不能隨心所欲。

    ΜC/OS-II內核的另外一個值得改進的地方就是其任務棧管理方法。在μC/OS-II內核中,各個不同的任務使用獨立的堆棧空間,堆棧的大小按每個任務所需要的最大堆棧深度來定義,這種方法可能會造成堆棧空間的浪費。下面討論如何在RTOS中多個任務共用一段連續存儲空間作為傻堆棧。

    1 任務切換要保存的數據

    簡單地說,一個任務可看作一個運行中的C函數。對于搶先式RTOS來說,在任務切換時,應保存當前任務的各種現場數據。現場數據包括局部變量、各個CPU寄存器、堆棧指針和程序被中止的任務指針。CPU寄存器是任何任務代碼均會用到的;而局部變量,一般的編譯器是將其它安排在堆棧空間中,堆棧指針也是各任務公用的,所以也需要保存。

    對于全局變量,由于一般是在內存中的固定位置,各任務所占用的空間完全獨立,所以不需要保存。

    在X86環境中,要保存的CPU寄存器共14個16位寄存器;通用寄存器8個(AX、BX、CX、DX、SP、BP、SI、BI)、段寄存器4個(CS、DS、ES、SS)以及指令指針IP和標志寄存器FR各1個。

    2 C編譯器中變量在堆棧中的位置

    對于一個存在函數調用嵌套的C程序來說,大部分編譯器將傳遞的參數和函數本身的局部變量放在了堆棧中,編譯器會自動生成壓棧(push)和彈棧(pop)代碼,以保存上級函數的運行寄存器。

    假設函數main()調用funl(),而funl()調用fun2(),則在執行fun2()中的代碼時,堆棧映像如圖1所示(X86 CPU的情況)。

    對于RTOS軟件,堆棧中的各種數據就是一個任務的作現場。一般CPU的堆棧指針SP只有一個,在進行任務切換時,必須將掛起任務所使用的堆棧內容保存起來,以便使該任務在下次喚醒時能從原地繼續運行。

    3 μC/OS-II對任務棧的處理方法與缺陷

    μC/OS-II為了保存任務堆棧中的數據,對每個任務定義一個數組變量作為堆棧,在任務切換時,將CPU堆棧指針SP指向該數組中的某個元素,即棧頂,如圖2所示。

    比如,在其ex21.c文件中定義的任務堆棧語句為:

    OS_STK TaskStartStk[TASK_STK_SIZE]; /*啟動任務堆棧*/

    OS_STK TaskClkStk[TASK_STK_SIZE]; /*時鐘任務堆棧*/

    OS_STK TasklStk[TASK_STK_SIZE]; /*任務1#,任務堆棧*/

    ……

    以上各任務堆棧數組變量在初始化函數OSTCBInit()中被會給了任務控制塊OS_TCB的OSTCBStkPtr變量。在任務切換時,μC/OS-II調用OSCtxSw匯編過程(OS_CPU_A.ASM文件),將CPU的SP指針指向該變量,從而使每個任務使用獨立的任務堆棧。

    LES BX,DWORD PTR DS:_OSTCBCur

    ;保存掛起任務的堆棧指針SP

    MOV ES:[BX 2],SS

    MOV ES:[BX 0],SP

    ……

    LESB X,DWORD PTR DS:_OSTCBHighRdy ;切換SP到要運行任務的堆棧空間

    MOV SS,ES:[BX 2]

    MOV SP,ES:[BX]

    ……

    在代碼中,變量OSTCBHighRdy(OSTCBCur)和堆棧指針變量OSTCBStkPtr的數值是同同的,因為OSTCBStkPtr是結構OSTCBHighRdy的第一個變量。

    這種任務棧處理方法的缺點是可能造成空間的浪費。因為一個任務如果堆棧滿了,該任務也就無法運行,即使其它任務的堆棧還有空間可用。當然,這種方法的好處是任務棧切換的時間非常短,只需要幾條指令。

    4

    【uC/OS-II任務棧處理的一種改進方法】相關文章:

    uC/OS-II的任務切換機理及中斷調度優化03-20

    研發用度的處理方法改進分析12-09

    uC/OS-II在EP7312上的移植03-18

    uC/OS-II在配電監測終端儀表中的應用03-18

    uC/OS-II內核超時等待機制的分析03-08

    一種“假中斷”現象及處理方法03-20

    使用uC/OS-II操作系統的短信息電話機03-18

    μC/OS-II的多任務信息流與CAN總線驅動03-18

    一種在NLOS環境下提高TOA定位算法精度的改進方法03-07

    主站蜘蛛池模板: 亚洲精品视频免费| 国产乱人伦偷精品视频免下载| 午夜DY888国产精品影院| 国产天天综合永久精品日| 99久久99久久精品国产片| 国产成人精品免费午夜app | 老司机精品影院91| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久99国产精品尤物| 国产a∨精品一区二区三区不卡| 国产91久久精品一区二区| 日韩一区二区三区精品| 日韩精品乱码AV一区二区| 国产精品无圣光一区二区| 久久久久久亚洲精品无码| 欧美亚洲国产精品久久蜜芽| 91精品国产成人网在线观看| 亚洲精品午夜无码电影网| 国产人妖乱国产精品人妖| 国产精品久久永久免费| 国产精品久久久99| 亚洲AⅤ永久无码精品AA| 91精品国产高清久久久久久国产嫩草| 久久国产精品成人片免费| 亚洲精品和日本精品| 精品日韩欧美国产| 蜜芽亚洲av无码精品色午夜| 久久精品成人免费观看97| 成人精品一区二区三区在线观看| 欧美精品区一级片免费播放| 久久九九精品99国产精品| 网友偷拍日韩精品| 精品精品国产国产| 国产成人精品日本亚洲专区| 日韩精品久久久久久| 久久丝袜精品中文字幕| 国产成人精品怡红院在线观看| 精品一区二区三区四区| 欧美成人精品欧美一级乱黄码| 欧美久久精品一级c片片| 精品国产一区二区三区2021|