亚洲一级电影在线观看,九九精品无码专区免费,亚洲AV无码资源在线观看 ,欧美国产高清

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

時間:2024-10-27 22:36:30 理工畢業(yè)論文 我要投稿
  • 相關(guān)推薦

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

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

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

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

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

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

1 任務(wù)切換要保存的數(shù)據(jù)

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

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

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

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

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

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

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

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

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

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

OS_STK TaskStartStk[TASK_STK_SIZE]; /*啟動任務(wù)堆棧*/

OS_STK TaskClkStk[TASK_STK_SIZE]; /*時鐘任務(wù)堆棧*/

OS_STK TasklStk[TASK_STK_SIZE]; /*任務(wù)1#,任務(wù)堆棧*/

……

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

LES BX,DWORD PTR DS:_OSTCBCur

;保存掛起任務(wù)的堆棧指針SP

MOV ES:[BX 2],SS

MOV ES:[BX 0],SP

……

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

MOV SS,ES:[BX 2]

MOV SP,ES:[BX]

……

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

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

4

【uC/OS-II任務(wù)棧處理的一種改進方法】相關(guān)文章:

uC/OS-II的任務(wù)切換機理及中斷調(diào)度優(yōu)化03-20

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

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

uC/OS-II在配電監(jiān)測終端儀表中的應(yīng)用03-18

uC/OS-II內(nèi)核超時等待機制的分析03-08

一種“假中斷”現(xiàn)象及處理方法03-20

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

μC/OS-II的多任務(wù)信息流與CAN總線驅(qū)動03-18

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

主站蜘蛛池模板: 五月综合网亚洲乱妇久久| 国产玖玖视频| 国产内射性高湖| 色偷偷偷久久伊人大杳蕉| 男女性高爱潮久久| 亚洲人成影视在线观看| 久久精品道一区二区三区| 免费人成视频欧美| 国产成人精彩在线视频50| 国产av无码国产av毛片| 午夜不卡无码中文字幕影院| 亚洲精品卡2卡3卡4卡5卡区| 久久午夜夜伦鲁鲁片免费无码影视| 成人国产欧美大片一区| 色综合天天操| 一区二区三区无码被窝影院| 欧美日产国产精品日产| 国产精品美脚玉足脚交欧美| 欧美黑人激情性久久| 宜宾县| 少妇做爰免费视频网站| 亚洲AV无码乱码精品| 天门市| 亚洲精品国产精品国自产小说| 制服丝袜人妻中文字幕在线| 亚洲AV无码精品一二三区推荐| 亚洲综合无码精品一区二区三区| 中文字幕亚洲乱码熟女在线萌芽| 国产精品久久vr专区| 成人无码视频在线观看网址| 久久人妻av一区二区软件| 国产一二三区在线| 国产精品丝袜一区二区三区| 国产女精品视频网站免费蜜芽| 久久精品国产再热青青青| 国产国产人免费视频成69| 亚洲国产成人无码av在线播放| 性夜久久一区国产9人妻| 亚洲精品第一国产综合精品| 国产欧美一区二区三区视频在线观看| 国产高清-国产av|