<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > μCOS-ii初學(xué)心得

μCOS-ii初學(xué)心得

作者: 時(shí)間:2017-05-11 來(lái)源:網(wǎng)絡(luò ) 收藏

  μC/OS-II 是一個(gè)源代碼公開(kāi)、可移植、可裁剪的實(shí)時(shí)多任務(wù)操作系統,具有穩定可靠、實(shí)時(shí)性好等優(yōu)點(diǎn),是專(zhuān)門(mén)針對微處理器和微控制器設計的實(shí)時(shí)內核,它的內核可以做到很小,很適合在單片機系統上移植。移植了μC/OS-II 的嵌入式系統可以使各個(gè)任務(wù)獨立工作,互不干涉,很容易實(shí)現準時(shí)而且無(wú)誤執行,使實(shí)時(shí)應用程序的設計和擴展變得容易,使應用程序的設計過(guò)程大為減化。在這個(gè)星期內,我通過(guò)對禁用了郵箱、隊列、文件系統的最簡(jiǎn)單的μCOS-ii操作系統進(jìn)行了學(xué)習,現將收獲分享如下。

本文引用地址:http://dyxdggzs.com/article/201705/359056.htm

  μCOS-ii運行過(guò)程

  μCOS-ii的主函數不到十行代碼,但是因為其高度的結構化以及良好的函數封裝,對其運行過(guò)程的了解對于學(xué)習μCOS-ii的編程思想以及設計思路具有重大的意義。

  我通過(guò)將μCOS-ii代碼移植到SST89V564RD單片機中,并且利用TI公司的溫度傳感器TMP124創(chuàng )建了兩個(gè)任務(wù):讀TMP122數據、向串口發(fā)送讀取的溫度值。要求兩個(gè)任務(wù)輪流執行,讀TMP122的優(yōu)先級高于向串口發(fā)送數據的優(yōu)先級。

  1 系統初始化

  在μCOS-ii中,系統初始化可以分為全局變量初始化、創(chuàng )建空閑任務(wù)任務(wù)、堆棧初始化、任務(wù)控制塊初始化等部分內容。

  全局變量初始化。由于μCOS-ii操作系統中定義了眾多與系統參數有關(guān)的全局變量,因此全局變量的初始化包含眾多內容。這些系統參數的初始化大都被封裝 在OSInit()函數中。尤其要注意的是,在OSInit函數中,OSRunning變量一定要被定義成FALSE,否則在OSStart函數中,系統 無(wú)法啟動(dòng)創(chuàng )建的任務(wù),系統因此變成了一個(gè)有始有終的函數,創(chuàng )建的任務(wù)永遠得不到執行。在實(shí)際運行過(guò)程中表現為主函數運行一次之后,系統不再運行。另外需要 注意的是OSTCBCur、OSTCBList等這幾個(gè)變量需要定義為(OS_TCB DT_XDATA *)0的類(lèi)型。因為這些變量是指向結構體TCB(Task Control Block)的指針,并不是數字〇。

  創(chuàng )建空閑任務(wù)。創(chuàng )建空閑任務(wù)包括進(jìn)入臨界區、任務(wù)堆棧初始化、TCB初始化、退出臨界區等內容,大部分是一些簡(jiǎn)單的賦值操作,比較簡(jiǎn)單,不再贅述。其中OSRdyGrp |= ptcb->OSTCBBitY; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;這兩句話(huà)要盡量看懂。因為這兩句話(huà)牽扯到后面OSUnMapTbl這個(gè)矩陣的理解。其含義為一旦任務(wù)就緒隊列中有"1"(即對應的任務(wù)就緒),則相應的任務(wù)組OSRdyGrp 相應的位變成1,OSRdyTbl中的相應的位也變成1.

  堆棧初始化以及任務(wù)控制塊初始化。比較容易理解,簡(jiǎn)單的賦值操作。不過(guò)在堆棧初始化中的ppdata = ppdata;opt = opt; 以及任務(wù)控制塊初始化中的pext= pext; stk_size= stk_size;pbos=pbos;opt=opt; id= id;這些語(yǔ)句剛開(kāi)始的時(shí)候很令人費解。其實(shí)這些是防止編譯器不斷的報warning,以免影響正常的調試的。

  2 任務(wù)創(chuàng )建

  同上述創(chuàng )建空任務(wù)大體雷同。需要注意的是此時(shí)操作系統的OSRunning變量還是處于FALSE狀態(tài),因此創(chuàng )建任務(wù)的過(guò)程中,操作系統并沒(méi)有開(kāi)始運行。 這就是為什么操作系統在開(kāi)始運行的時(shí)候不是選擇第一個(gè)創(chuàng )建的任務(wù)開(kāi)始運行,而是從所有的任務(wù)里面選擇優(yōu)先級最高的運行的原因。

  3 任務(wù)調度

  任務(wù)調度是從OSStart函數開(kāi)始的。具體包括OSStart、OsStartHighRdy、Task1~n、OSTimeDlyHMSM、OSSched等函數,其中任務(wù)交換是在匯編語(yǔ)言文件的OS_TASK_SW函數中運行的。

  OsStart在整個(gè)系統運行的過(guò)程中只會(huì )運行一次。在系統創(chuàng )建任務(wù)之后運行。主要目的是從任務(wù)就緒表中挑選出優(yōu)先級最高的任務(wù),并開(kāi)始運行優(yōu)先級最高的任務(wù)。

  OsStartHighRdy為asm文件中的一部分。主要是堆棧的操作。目的是要把高優(yōu)先級任務(wù)的任務(wù)堆棧復制到寄存器中,為即將開(kāi)始的運行最高優(yōu)先級的任務(wù)做好準備。

  Task1~n。Task為一個(gè)無(wú)限循環(huán)函數。雖然是無(wú)限循環(huán)函數,但是與平常前后臺系統中的無(wú)限循環(huán)具有區別。因為μCOS-ii操作系統并不是一個(gè)像 Linux那樣的時(shí)間片輪流處理的操作系統,它僅僅是一個(gè)處理完一部分內容之后再去處理另一部分內容的實(shí)時(shí)操作系統。這就要求在每一個(gè)任務(wù)的每一個(gè)無(wú)限循 環(huán)中都要加一個(gè)調用OSSched函數的函數。

  OSTimeDlyHMSM主要是為用戶(hù)提供一個(gè)良好的借口,將用戶(hù)輸入的時(shí)、分、秒、毫秒這四個(gè)數據轉換成系統的滴答數,然后調用OSTimeDly實(shí) 現。在OSTimeDly中調用OSSched,確保系統的實(shí)時(shí)性。OSSched函數結構也類(lèi)似于OSStart,主要是計算出任務(wù)就緒表中最高優(yōu)先級 的任務(wù),通過(guò)OS_TASK_SW中的堆棧的操作實(shí)現任務(wù)的交換。

  μCOS-ii查找最高優(yōu)先級算法的實(shí)現

  指導思想:以空間換時(shí)間。

  在查看源代碼的過(guò)程中,最令人費解的或許就是OSUnMapTbl這個(gè)矩陣了?,F將此矩陣復制如下:

  INT8U const DT_XDATA OSUnMapTbl[] = {

  0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0

  };

  在了解這個(gè)矩陣的工作原理之前,我們有必要了解一下幾個(gè)變量的含義:

  OSRdyGrp 是一個(gè)8位的unsigned char型數。由于該μCOS-ii系統最多允許prio為63,也就是說(shuō)最多允許有64個(gè)優(yōu)先級。64個(gè)優(yōu)先級被分成了八組,每組有八個(gè)優(yōu)先級。如果有 任何一組中的任務(wù)進(jìn)入了就緒狀態(tài),則該組所對應的位變?yōu)?。比如優(yōu)先級為4,23,56的任務(wù)同時(shí)進(jìn)入了就緒態(tài),則對應第0,2,7組中有任務(wù)進(jìn)入了就緒 態(tài),則此時(shí)OSRdyGrp 應為 10000101。

  OSRdyTbl為一個(gè)有8個(gè)元素的8位數的數組,分別為OSRdyTbl[0]...OSRdyTbl[7]。從OSRdyTbl[0]到 OSRdyTbl[7]的每一位數對應相應優(yōu)先級的任務(wù)是不是進(jìn)入了就緒態(tài)。還是上面的例子,假如優(yōu)先級為4,23,56的任務(wù)進(jìn)入了就緒態(tài),則 OSRdyTbl[0]的第4位,OSRdyTbl[2]的第7位,OSRdyTbl[7]的第0位變成1,其他的位仍然保持零。

  介紹完兩個(gè)變量之后,就可以很容易理解這個(gè)矩陣的作用了。矩陣的第i個(gè)數字表示用二進(jìn)制表示的i中1所出現的最小位數。比如對于矩陣的第48個(gè)數字,48用二進(jìn)制表示為00110000,在第4位以及第5位中出現了1,故去最小值,則OSUnMapTbl[48]=4 。也就是說(shuō),通過(guò)查這個(gè)矩陣得到的是最小的出現1的位數。假如對于OSRdyGrp 來(lái)說(shuō),在OSRdyGrp 等于48的情況下,意味著(zhù)第四組與第五組中有任務(wù)處于就緒狀態(tài),則通過(guò)此表可以得出最高優(yōu)先級的任務(wù)在第四組中。假如對于OSRdyTbl來(lái) 說(shuō),OSRdyTbl[4]表示第四組中每一個(gè)元素是不是處于就緒態(tài)。還是拿48來(lái)打比方,假如OSRdyTbl[4]等于48,有48用二進(jìn)制表示為 00110000可得第四位與第五位中有兩個(gè)任務(wù)處于就緒態(tài),此時(shí)查詢(xún)OSUnMapTbl[48]=4可得優(yōu)先級最高的任務(wù)處于第四位上。由此很容易理 解這兩行代碼:

  y= OSUnMapTbl[OSRdyGrp];

  x = OSUnMapTbl[OSRdyTbl[y]];

  因此得到的y為最高優(yōu)先級所在的組號。X為最高優(yōu)先級所在的組中最高優(yōu)先級所在的組的組號。由于每組有8個(gè)成員,對于y組第x個(gè)來(lái)說(shuō),優(yōu)先級自然是 8*y+x 。由此得到了最高優(yōu)先級。下面的代碼不難理解。

  OSPrioHighRdy = (INT8U)((y << 3) + x);

  此外,因為這個(gè)矩陣無(wú)論在何種情況下,都是不變的,因此個(gè)人認為原μCOS-ii系統中定義為DT_XDATA完全沒(méi)有必要,只是增加了系統的開(kāi)銷(xiāo)。因此我嘗試將此變量類(lèi)型改成DT_CODE ,經(jīng)過(guò)運行TMP124的嘗試,系統運行幾十分鐘后仍然正常。因此得出了此處可以改進(jìn)的建議。而且改進(jìn)之后系統的占用xdata從600多字節減少到400多字節,系統資源占用減少很明顯。

  可能編寫(xiě)μCOS-ii的工程師為了提高可移植性,將OSUnMapTbl定義為DT_XDATA吧。僅僅猜測而已。



關(guān)鍵詞: μC/OS-II

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>