日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UC/OS-II的学习

發(fā)布時(shí)間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UC/OS-II的学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?? 粗略的的看了邵貝貝老師的那本書,感覺有點(diǎn)眉目。UC/OS-II的全局變量繁多,剛接觸的時(shí)候容易弄混淆,現(xiàn)在總結(jié)下:

?

?

OSRunning:??用于標(biāo)識(shí)多任務(wù)環(huán)境是否已經(jīng)開啟運(yùn)行,在OSStart()函數(shù)里啟動(dòng)任務(wù)后就置為True。

OSIntNesting:用于標(biāo)識(shí)中斷嵌套層數(shù)。產(chǎn)生一次中斷可以調(diào)用OSIntEnter()函數(shù)使該值自增1,處理完一次中斷再調(diào)用OSIntExit()自減1。

OS_TCB:一個(gè)結(jié)構(gòu)體變量,每建立一個(gè)任務(wù)都會(huì)為該任務(wù)指定一個(gè)OS_TCB,包含該任務(wù)的棧頂指針,任務(wù)優(yōu)先級(jí),任務(wù)狀態(tài)字,延時(shí)節(jié)拍等所有相關(guān)信息。每個(gè)任務(wù)的OS_TCB都存在于一個(gè)雙向鏈表內(nèi),并使變量OSTCBList指向最后建立的那個(gè)任務(wù)的OS_TCB。

OS_STK:任務(wù)堆棧,每個(gè)任務(wù)都有一個(gè)自己的堆棧空間,用于保存寄存器,狀態(tài)值,和任務(wù)的入口地址。這個(gè)堆棧與系統(tǒng)棧沒有什么關(guān)系,只是用戶為一個(gè)任務(wù)分配的存儲(chǔ)任務(wù)信息的空間,只需要是一個(gè)連續(xù)的存儲(chǔ)空間即可。

OSRdyGrp,OSRdyTbl[
]用于標(biāo)識(shí)就緒的任務(wù)。uC/OS根據(jù)優(yōu)先級(jí)唯一確定一個(gè)任務(wù),也即一個(gè)優(yōu)先級(jí)只能分配給一個(gè)任務(wù)。OSRdyTbl[ ]里保存(MAX_TASKS/8+1)個(gè)字節(jié),每個(gè)字節(jié)又有8個(gè)Bit,從最低位開始分別對(duì)應(yīng)0~LOWEST_PRIO優(yōu)先級(jí)的任務(wù),任務(wù)就緒時(shí)就將該任務(wù)的優(yōu)先級(jí)所在Bit置1,否則清0。
OSRdyGrp完全是為了找到最高優(yōu)先級(jí)方便而設(shè)立的,將OSRdyTbl[ ]里每個(gè)字節(jié)代表的8個(gè)任務(wù)劃為一個(gè)組,只要某一組內(nèi)有就緒任務(wù)時(shí),OSRdyGrp的相應(yīng)位就置1。比如,只要OSRdyTbl[0]不為0,則OSRdyGrp的第0位就置1,依次類推。

OSPrioCur
:這是一個(gè)整型數(shù),表示當(dāng)前執(zhí)行任務(wù)的優(yōu)先級(jí)數(shù)。

OSPrioHighRdy:一個(gè)整型數(shù),表示當(dāng)前最高級(jí)別的就緒任務(wù)的優(yōu)先級(jí)數(shù)。

OSTCBHighRdy:這是一個(gè)指針,它指向最高優(yōu)先級(jí)就緒任務(wù)的OS_TCB。

OSTCBCur:一個(gè)指針,指向當(dāng)前執(zhí)行任務(wù)的OS_TCB。

OSTCBTbl[ ]初始化時(shí)建立的一塊存儲(chǔ)空間,一共建立了MAX_TASKS個(gè)OS_TCB空間。并令變量OSTCBFreeList總是指向下一個(gè)可用的OS_TCB空間。當(dāng)新建立一個(gè)任務(wù)時(shí),就將一個(gè)空的OS_TCB空間分配給它使用。

OSTCBPrioTbl[
]這是一個(gè)指針數(shù)組,用于保存就緒任務(wù)的OS_TCB地址,一共有MAX_TASKS個(gè)值,依次對(duì)應(yīng)0~LOWEST_PRIO優(yōu)先級(jí)的任務(wù)。當(dāng)某一優(yōu)先級(jí)未分配給一個(gè)任務(wù)時(shí),該數(shù)組對(duì)應(yīng)元素的值為(void *)0,當(dāng)某優(yōu)先級(jí)的任務(wù)分配給一個(gè)處于就緒態(tài)的任務(wù)時(shí),對(duì)應(yīng)元素的內(nèi)容就被寫入該任務(wù)的OS_TCB所在地址。

拿到?jīng)]用過的系統(tǒng),首先就想知道它是怎么用的,對(duì)于一個(gè)實(shí)時(shí)操作系統(tǒng),先要解決以下幾個(gè)問題:
如何切換任務(wù)
uC/OS多任務(wù)的原理是,在某個(gè)任務(wù)重新獲得CPU控制權(quán)的時(shí)候,先把上一個(gè)執(zhí)行的任務(wù)的所有寄存器以及它的返回地址保存起來,然后把現(xiàn)在要執(zhí)行的任務(wù)的所有變量恢復(fù)到操作寄存器里,然后使PC指向這個(gè)任務(wù)的處理函數(shù)。而保存和恢復(fù)變量的重要媒介就是每個(gè)任務(wù)獨(dú)有的堆棧空間,這點(diǎn)跟中斷處理的過程幾乎一樣,重新獲得CPU的任務(wù)可以看成是中斷函數(shù),原先執(zhí)行的看成是被中斷的函數(shù),只不過uC/OS是模擬中斷來切換任務(wù),所有堆棧的保存和恢復(fù)要在移植不同處理器的時(shí)候根據(jù)實(shí)際情況來完成,目的只有一個(gè),就是模擬中斷的壓棧和出棧操作。
uC/OS引起任務(wù)切換的功能函數(shù)主要是兩個(gè),任務(wù)級(jí)的切換是OSSched(),中斷級(jí)的切換由OSIntExit()完成。而前者中真正實(shí)現(xiàn)切換操作的是OS_TASK_SW()宏,后者真正實(shí)現(xiàn)切換功能的是OSIntCtxSw(),這個(gè)宏如何實(shí)現(xiàn),移植不同的處理器有不同的處理方法,目的仍然是,把現(xiàn)場(chǎng)處理的跟真正發(fā)生了中斷一樣,該保存的保存,該恢復(fù)的恢復(fù)。
因此可以得到,uC/OS切換任務(wù)時(shí)可以有兩種方法,第一種是擁有CPU控制權(quán)的任務(wù)主動(dòng)調(diào)用函數(shù)OSTimeDly()、OSTaskSuspend()等這類函數(shù)把控制權(quán)交出來,重新分配給下一個(gè)優(yōu)先級(jí)高的任務(wù),實(shí)際上是依靠OSSched()調(diào)度任務(wù)。第二種方法是CPU產(chǎn)生中斷,把當(dāng)前任務(wù)的控制權(quán)剝奪掉,令它掛起,從而使下一優(yōu)先級(jí)的任務(wù)得以執(zhí)行,當(dāng)然,如果中斷沒有令當(dāng)前任務(wù)掛起,中斷返回后它依然是最高優(yōu)先級(jí)的話,CPU將繼續(xù)被它控制。

如何查找最高優(yōu)先級(jí)
uC/OS把一個(gè)字節(jié)可能的256個(gè)值的所有優(yōu)先級(jí)狀況都做成一個(gè)表OSUnMapTbl[ ],比如,如果字節(jié)的值為7,即0000 0111,那么任務(wù)0,1,2都處于就緒態(tài),最高優(yōu)先級(jí)當(dāng)然是0,那么OSUnMapTbl[7] == 0,因此,先通過y = OSUnMapTbl[OSRdyGrp]找到最高優(yōu)先級(jí)的組y,然后通過x = OSUnMapTbl[OSRdyTbl[OSRdyGrp]]得到這個(gè)組里的最高優(yōu)先級(jí)任務(wù)號(hào)x。因?yàn)閡C/OS最大任務(wù)數(shù)不超過64,可以把優(yōu)先級(jí)數(shù)看成是一個(gè)六位的二進(jìn)制數(shù),高三位表示所在組,低三位表示組內(nèi)的號(hào),因此y<<3+x就是找到的最高優(yōu)先級(jí)數(shù)了,實(shí)在佩服OSUnMapTbl[ ]的設(shè)計(jì)。

作者進(jìn)行很多查表的設(shè)計(jì),為的是提高運(yùn)行的速度。很想知道作者是如何創(chuàng)造出來的這些巧妙的查表設(shè)計(jì)的。uc/os-II源代碼算是在嵌入式OS中比較小巧玲瓏的啦,例如嵌入式linux的系統(tǒng)是怎么寫出來的呢?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的UC/OS-II的学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。