- 相關(guān)推薦
uC/OS-II任務(wù)棧處理的一種改進(jìn)方法
摘要:在μC/OS-II內(nèi)核中,各個(gè)不同的任務(wù)使用獨(dú)立的堆?臻g,堆棧的大小按每個(gè)任務(wù)所需要的最大堆棧深度來定義,這種方法可能會(huì)造成堆?臻g浪費(fèi)。本文敘述如何在RTOS中多個(gè)任務(wù)共用連續(xù)存儲(chǔ)空間作為任務(wù)棧的方法,并詳細(xì)比較二者的優(yōu)缺點(diǎn)和適用性。關(guān)鍵詞:μC/OS-II 任務(wù)堆棧 RTOS 共用空間堆棧
關(guān)于μC/OS-II這個(gè)實(shí)時(shí)內(nèi)核及其應(yīng)用已經(jīng)有很多文章介紹了,對(duì)于學(xué)習(xí)RTOS的人來說,這個(gè)系統(tǒng)是很好的學(xué)習(xí)起點(diǎn)。雖然文獻(xiàn)[1]的源代碼沒有行號(hào)和函數(shù)名交叉索引表等,給源代碼閱讀造成一些困難(可使用BC31的grep查找功能,提高閱讀效率),好在代碼不是很長,前面又有詳細(xì)的中文說明,對(duì)于有一定X86匯編和C語言基礎(chǔ)的人來說,仍然可以在不長的時(shí)間內(nèi)掌握。
μC/OS-II內(nèi)核是一個(gè)搶先式內(nèi)核,可以進(jìn)行任務(wù)間切換,也可以讓一個(gè)任務(wù)在得不到某個(gè)資源時(shí)休眠一定時(shí)間后再繼續(xù)運(yùn)行;提供了用于共享資源管理的信號(hào)燈,用于進(jìn)程通信的消息隊(duì)列和郵箱,甚至提供了存儲(chǔ)器管理機(jī)制,一個(gè)比較全面的系統(tǒng)。
μC/OS-II內(nèi)核有些地方仍然值得改進(jìn),比如該系統(tǒng)不支持時(shí)間片調(diào)度。如果有一個(gè)任務(wù)中一段死循環(huán)代碼(或者條件循環(huán)代碼),代碼就會(huì)永遠(yuǎn)(或長時(shí)間)在此處執(zhí)行,調(diào)度程序無法控制,其它任務(wù)也就是不到及時(shí)執(zhí)行。這種搶先式實(shí)際上和非搶先式系統(tǒng)存在著同樣問題。當(dāng)然,如果這種代碼不一個(gè)BUG,問題是可以解決的,在不提供時(shí)間片調(diào)度的搶先式系統(tǒng)中,一般采取信號(hào)燈,或者任務(wù)主動(dòng)休眠的方法(對(duì)于μC/OS-II,很容易改造成支持時(shí)間片調(diào)度,只要在定時(shí)中斷服務(wù)程序調(diào)用OSIntCtxSw()函數(shù)即可);非搶先式系統(tǒng)一般采取有限狀態(tài)機(jī)方法,不使用這種耗時(shí)很長的循環(huán)代碼。不過,無論如何,對(duì)RTOS的使用者來說,這畢竟會(huì)使得任務(wù)函數(shù)的編碼不能隨心所欲。
ΜC/OS-II內(nèi)核的另外一個(gè)值得改進(jìn)的地方就是其任務(wù)棧管理方法。在μC/OS-II內(nèi)核中,各個(gè)不同的任務(wù)使用獨(dú)立的堆?臻g,堆棧的大小按每個(gè)任務(wù)所需要的最大堆棧深度來定義,這種方法可能會(huì)造成堆棧空間的浪費(fèi)。下面討論如何在RTOS中多個(gè)任務(wù)共用一段連續(xù)存儲(chǔ)空間作為傻堆棧。
1 任務(wù)切換要保存的數(shù)據(jù)
簡(jiǎn)單地說,一個(gè)任務(wù)可看作一個(gè)運(yùn)行中的C函數(shù)。對(duì)于搶先式RTOS來說,在任務(wù)切換時(shí),應(yīng)保存當(dāng)前任務(wù)的各種現(xiàn)場(chǎng)數(shù)據(jù),F(xiàn)場(chǎng)數(shù)據(jù)包括局部變量、各個(gè)CPU寄存器、堆棧指針和程序被中止的任務(wù)指針。CPU寄存器是任何任務(wù)代碼均會(huì)用到的;而局部變量,一般的編譯器是將其它安排在堆?臻g中,堆棧指針也是各任務(wù)公用的,所以也需要保存。
對(duì)于全局變量,由于一般是在內(nèi)存中的固定位置,各任務(wù)所占用的空間完全獨(dú)立,所以不需要保存。
在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和標(biāo)志寄存器FR各1個(gè)。
2 C編譯器中變量在堆棧
[1] [2] [3] [4] [5]
【uC/OS-II任務(wù)棧處理的一種改進(jìn)方法】相關(guān)文章:
Muller法的一種改進(jìn)方法04-28
一種Yahalom協(xié)議改進(jìn)方法的分析與改進(jìn)05-03
雷達(dá)截面測(cè)量數(shù)據(jù)處理方法的改進(jìn)04-29
一種多任務(wù)導(dǎo)航星座設(shè)計(jì)方法04-30
一種改進(jìn)的等效線性化方法04-27
一種改進(jìn)的雙向電泳染色方法05-02