?? ucos51+++
字號(hào):
2002/12/23
gdtyy 你好,幾個(gè)問(wèn)題想請(qǐng)教一下
這些天我仔細(xì)看了很多ucosii的資料,但有些疑問(wèn),我想真要能將ucosii應(yīng)用起來(lái),我們需要理解的問(wèn)題分為三個(gè)
ucosii工作原理
ucosii 移植
ucosii 和應(yīng)用程序的接口(用戶(hù)程序如何嵌入到操作系統(tǒng)中運(yùn)行)
首先ucossii 的工作核心原理是:讓最高優(yōu)先級(jí)的任務(wù)處于運(yùn)行狀態(tài)。這需要操作系統(tǒng)在某個(gè)時(shí)間得運(yùn)行任務(wù)調(diào)度的一個(gè)算法(操作系統(tǒng)提供了這個(gè)函數(shù)),她將自動(dòng)完成調(diào)度運(yùn)算并完成任務(wù)的切換。調(diào)度操作在下面情況中將被運(yùn)行:調(diào)用api函數(shù)(用戶(hù)主動(dòng)調(diào)度),中斷(系統(tǒng)、用戶(hù)的)
我現(xiàn)在不能理解的是調(diào)度算法的api函數(shù)到底是怎么實(shí)現(xiàn)的(對(duì)于任務(wù)的優(yōu)先級(jí)運(yùn)算(查表)這個(gè)我知道),她怎么實(shí)現(xiàn)調(diào)度前運(yùn)行的任務(wù)的數(shù)據(jù)(特別是pc地址)保存?如果任務(wù)從運(yùn)行到就緒再到運(yùn)行,它是否將從新開(kāi)始運(yùn)行任務(wù)程序,還是從調(diào)度以前的斷點(diǎn)處運(yùn)行?任務(wù)為什么需要被寫(xiě)成無(wú)限循環(huán)方式?還有,中斷結(jié)束后,系統(tǒng)也要進(jìn)行調(diào)度操作,那么她怎么實(shí)現(xiàn)的?因?yàn)榘凑粘@恚袛嘟Y(jié)束后,系統(tǒng)應(yīng)該直接回到原先任務(wù)的斷點(diǎn)處運(yùn)行,除非她在中斷函數(shù)中將調(diào)度函數(shù)用軟件方式入棧了,這樣reti退出后,系統(tǒng)運(yùn)行調(diào)度函數(shù)。。。如果是這樣,用戶(hù)自己的中斷函數(shù)是否也需要這樣編寫(xiě)(用軟件將調(diào)度函數(shù)入棧)才能實(shí)現(xiàn)調(diào)度運(yùn)算呢?否則系統(tǒng)就不執(zhí)行調(diào)度算法,直到系統(tǒng)的定時(shí)中斷到了才執(zhí)行調(diào)度算法(系統(tǒng)的中斷函數(shù)是否有這樣的特殊處理),當(dāng)然系統(tǒng)可能還有其他的什么方式來(lái)實(shí)現(xiàn)調(diào)度算法(我是想不出來(lái)了),請(qǐng)賜教~~~謝謝~~~~~~~~~~~
TO:XXX
uCOSII工作核心原理是:近似地讓最高優(yōu)先級(jí)的就緒任務(wù)處于運(yùn)行狀態(tài)。
操作系統(tǒng)將在下面情況中進(jìn)行任務(wù)調(diào)度:調(diào)用API函數(shù)(用戶(hù)主動(dòng)調(diào)用),中斷(系統(tǒng)占用的時(shí)間片中斷OsTimeTick(),用戶(hù)使用的中斷)。
調(diào)度算法書(shū)上講得很清楚,我主要講一下整體思路。
(1)在調(diào)用API函數(shù)時(shí),有可能引起阻塞,如果系統(tǒng)API函數(shù)察覺(jué)到運(yùn)行條件不滿(mǎn)足,需要切換就調(diào)用OSSched()調(diào)度函數(shù),這個(gè)過(guò)程是系統(tǒng)自動(dòng)完成的,用戶(hù)沒(méi)有參與。OSSched()判斷是否切換,如果需要切換,則此函數(shù)調(diào)用OS_TASK_SW()。這個(gè)函數(shù)模擬一次中斷(在51里沒(méi)有軟中斷,我用子程序調(diào)用模擬,效果相同),好象程序被中斷打斷了,其實(shí)是OS故意制造的假象,目的是為了任務(wù)切換。既然是中斷,那么返回地址(即緊鄰OS_TASK_SW()的下一條匯編指令的PC地址)就被自動(dòng)壓入堆棧,接著在中斷程序里保存CPU寄存器(PUSHALL)……。堆棧結(jié)構(gòu)不是任意的,而是嚴(yán)格按照uCOSII規(guī)范處理。OS每次切換都會(huì)保存和恢復(fù)全部現(xiàn)場(chǎng)信息(POPALL),然后用RETI回到任務(wù)斷點(diǎn)繼續(xù)執(zhí)行。這個(gè)斷點(diǎn)就是OSSched()函數(shù)里的緊鄰OS_TASK_SW()的下一條匯編指令的PC地址。切換的整個(gè)過(guò)程就是,用戶(hù)任務(wù)程序調(diào)用系統(tǒng)API函數(shù),API調(diào)用OSSched(),OSSched()調(diào)用軟中斷OS_TASK_SW()即OSCtxSw,返回地址(PC值)壓棧,進(jìn)入OSCtxSw中斷處理子程序內(nèi)部。反之,切換程序調(diào)用RETI返回緊鄰OS_TASK_SW()的下一條匯編指令的PC地址,進(jìn)而返回OSSched()下一句,再返回API下一句,即用戶(hù)程序斷點(diǎn)。因此,如果任務(wù)從運(yùn)行到就緒再到運(yùn)行,它是從調(diào)度前的斷點(diǎn)處運(yùn)行。
(2)中斷會(huì)引發(fā)條件變化,在退出前必須進(jìn)行任務(wù)調(diào)度。uCOSII要求中斷的堆棧結(jié)構(gòu)符合規(guī)范,以便正確協(xié)調(diào)中斷退出和任務(wù)切換。前面已經(jīng)說(shuō)到任務(wù)切換實(shí)際是模擬一次中斷事件,而在真正的中斷里省去了模擬(本身就是中斷嘛)。只要規(guī)定中斷堆棧結(jié)構(gòu)和uCOSII模擬的堆棧結(jié)構(gòu)一樣,就能保證在中斷里進(jìn)行正確的切換。任務(wù)切換發(fā)生在中斷退出前,此時(shí)還沒(méi)有返回中斷斷點(diǎn)。仔細(xì)觀察中斷程序和切換程序最后兩句,它們是一模一樣的,POPALL+RETI。即要么直接從中斷程序退出,返回?cái)帱c(diǎn);要么先保存現(xiàn)場(chǎng)到TCB,等到恢復(fù)現(xiàn)場(chǎng)時(shí)再?gòu)那袚Q函數(shù)返回原來(lái)的中斷斷點(diǎn)(由于中斷和切換函數(shù)遵循共同的堆棧結(jié)構(gòu),所以退出操作相同,效果也相同)。用戶(hù)編寫(xiě)的中斷子程序必須按照uCOSII規(guī)范書(shū)寫(xiě)。任務(wù)調(diào)度發(fā)生在中斷退出前,是非常及時(shí)的,不會(huì)等到下一時(shí)間片才處理。OSIntCtxSw()函數(shù)對(duì)堆棧指針做了簡(jiǎn)單調(diào)整,以保證所有掛起任務(wù)的棧結(jié)構(gòu)看起來(lái)是一樣的。
(3)在uCOSII里,任務(wù)必須寫(xiě)成兩種形式之一(《uCOSII中文版》p99頁(yè))。在有些RTOS開(kāi)發(fā)環(huán)境里沒(méi)有要求顯式調(diào)用OSTaskDel(),這是因?yàn)殚_(kāi)發(fā)環(huán)境自動(dòng)做了處理,實(shí)際原理都是一樣的。uCOSII的開(kāi)發(fā)依賴(lài)于編譯器,目前沒(méi)有專(zhuān)用開(kāi)發(fā)環(huán)境,所以出現(xiàn)這些不便之處是可以理解的。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -