激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

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

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

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

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

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

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

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

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

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

簡(jiǎn)單地說(shuō),一個(gè)任務(wù)可看作一個(gè)運行中的C函數。對于搶先式RTOS來(lái)說(shuō),在任務(wù)切換時(shí),應保存當前任務(wù)的各種現場(chǎng)數據,F場(chǎng)數據包括局部變量、各個(gè)CPU寄存器、堆棧指針和程序被中止的任務(wù)指針。CPU寄存器是任何任務(wù)代碼均會(huì )用到的;而局部變量,一般的編譯器是將其它安排在堆?臻g中,堆棧指針也是各任務(wù)公用的,所以也需要保存。

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

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

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

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

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

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

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

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

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

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

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

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

……

以上各任務(wù)堆棧數組變量在初始化函數OSTCBInit()中被會(huì )給了任務(wù)控制塊OS_TCB的OSTCBStkPtr變量。在任務(wù)切換時(shí),μC/OS-II調用OSCtxSw匯編過(guò)程(OS_CPU_A.ASM文件),將CPU的SP指針指向該變量,從而使每個(gè)任務(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ù)的堆?臻g

MOV SS,ES:[BX 2]

MOV SP,ES:[BX]

……

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

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

4

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

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

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

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

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

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

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

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

μC/OS-II的多任務(wù)信息流與CAN總線(xiàn)驅動(dòng)03-18

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

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频