|
有近三個(gè)月的時(shí)間沒有看關(guān)于UCOS的書了,今天我重新拿起那本任哲寫的關(guān)于UCOS,感覺有點(diǎn)親切,今天下午我把移植ARM的的UCOS的代碼看了一部分,感覺比以前好多了,待會(huì)我再詳細(xì)解,我先把我剛才看的東西通過我的理解把它寫下來,以后好復(fù)習(xí)。
我這里講的是基于UCOS 2.52的版本,關(guān)于UCOS的介紹,我就不多說了,反正只要知道它是一個(gè)實(shí)時(shí)的微內(nèi)核,它擁有64個(gè)優(yōu)先級(jí)別,級(jí)別數(shù)最大反而優(yōu)先級(jí)越低,至于為什么,呵呵,網(wǎng)友們應(yīng)該不會(huì)這樣想吧;知道這點(diǎn)就算是有了一個(gè)門外漢的初步了解拉。
要想深入了解它,首先我們得知道它的文件結(jié)構(gòu),因?yàn)樗且粋€(gè)實(shí)時(shí)嵌入式的操作系統(tǒng),所以對(duì)移植要求比較高,正因?yàn)槿绱似鋭?chuàng)作者幾乎全部是用ANSIC寫的,只有幾個(gè)文件與你所用的編譯環(huán)境和硬件抽象底層有關(guān)的需要自己寫,他們分別是OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C,這幾個(gè)文件里面分別放的是什么東西呢,呵呵,先別急,一個(gè)一個(gè)來,OS_CPU.H里面放的是編譯環(huán)境數(shù)據(jù)類型的重新定義,怎么說呢,該操作系統(tǒng)的創(chuàng)作者為了增強(qiáng)移植性,它把數(shù)據(jù)類型全部交有我們用戶來定義,也就是為了避免這種現(xiàn)象,比如說int在vc++中是16位的,而在ADS1.2中是32位的,而我們操作系統(tǒng)中用的是16位的,那么為了防止沖突,我們?cè)贏DS1.2中時(shí)必須把int定義為16位的int,記住我們?cè)谟胻ypedef重定義數(shù)據(jù)類型是,是不能把新的定義名稱和該編譯器中的數(shù)據(jù)類型名一樣的,否則編譯器會(huì)打架的,我上面用的int是不對(duì)的,主要是為了更好的讓大家理解;然后在這個(gè)文件中我們還要定義一些與CPU相關(guān)的宏,主要是什么呢,就是開中斷和關(guān)中斷兩個(gè)宏,為什么要這兩個(gè)宏,又該怎么用呢?其實(shí)這就好比我們?cè)趯?duì)某一個(gè)數(shù)據(jù)進(jìn)行采集時(shí),是不能被中斷的,那么我們通過什么來實(shí)現(xiàn)呢,相信大家應(yīng)該明白了。OK!搞定一個(gè)文件了,接下來是OS_CPU_A.ASM,這玩意可有點(diǎn)難拉,他包含一些與所有處理器都相關(guān)的函數(shù),比如說進(jìn)入中斷前的數(shù)據(jù)保護(hù)好中斷結(jié)束后的數(shù)據(jù)恢復(fù),接下來就是OS_CPU.C,它里面主要就是一個(gè)棧的定義,應(yīng)該好理解。
移植時(shí)要自己修改的或自己寫的介紹完了,我稍微簡(jiǎn)單介紹下它這個(gè)核包含些什么玩意兒,請(qǐng)看下列表:
OS_CORE.C//核心服務(wù)模塊文件
OS_FLAG.C//信號(hào)量集服務(wù)模塊文件
OS_MBOX.C//消息郵箱服務(wù)模塊問價(jià)
OS_MEM.C//存儲(chǔ)管理服務(wù)模塊文件
OS_MUTEX.C//互斥型信號(hào)量服務(wù)模塊文件
OS_Q.C//消息隊(duì)列服務(wù)模塊文件
OS_SEM.C//信號(hào)量服務(wù)模塊文件
OS_TASK.C//任務(wù)管理服務(wù)模塊文件
OS_TIME.C//時(shí)間管理服務(wù)文件
uCOS_II.C
uCOS_II.H//與應(yīng)用相關(guān)的配置文件
該系統(tǒng)的可裁剪是通過條件編譯來實(shí)現(xiàn)的,其為用戶定義了一個(gè)配置文件OS_CFG.H,也就是我們?cè)贠S_CFG.H中把某個(gè)條件定義為1,編譯器就對(duì)它進(jìn)行編譯,反之就不編譯,這就實(shí)現(xiàn)了裁剪的功能。好了,關(guān)于這個(gè)核的文件結(jié)構(gòu)我就先寫這么多拉,夠用了的。僅僅是我的理解,如果有不對(duì)的地方,或有更好的說法,請(qǐng)一定要指出并留言咯。我先謝謝拉。
該核的文件結(jié)構(gòu)了解了后,然后就可以向它的核進(jìn)軍,首先我們從任務(wù)來下手,一提到操作系統(tǒng)的任務(wù),我們必須了解幾個(gè)任務(wù)可能所處的狀態(tài):1)睡眠狀態(tài):它是一個(gè)什么樣的狀態(tài)呢,它其實(shí)是指一個(gè)任務(wù)在內(nèi)存中就占用一部分ROM,它沒有被操作系統(tǒng)分配任務(wù)控制塊,它和其他狀態(tài)下的任務(wù)沒有任何直接聯(lián)系,就好比我們?nèi)コ燥垼诼飞希?)就緒狀態(tài):它是指操作系統(tǒng)給它分配了任務(wù)控制塊,已經(jīng)在就緒列表中登記中,就好比我們?nèi)コ燥垥r(shí)在那排隊(duì)一樣;3)運(yùn)行狀態(tài):它是指一個(gè)任務(wù)正在運(yùn)行,應(yīng)該好理解,就好比食堂工作人員在給我們打飯;4)等待狀態(tài):就是一個(gè)任務(wù)由于一個(gè)的條件沒有滿足,比如說在等待一個(gè)信號(hào)量的到來,而被至于等待狀態(tài),就像我們?cè)诖蝻垥r(shí),如果工作人員突然尿急,那你沒辦法,你就得等拉;5)中斷服務(wù)狀態(tài),就是在某個(gè)時(shí)刻突然因?yàn)橐粋€(gè)中斷到來,那么這個(gè)任務(wù)就會(huì)馬上被中斷掉,從而處于中斷服務(wù)狀態(tài),比如一個(gè)餓得受不了的人,如果搶你前面,本來該你打飯的,可是你看到他這個(gè)樣子,不忍心,那么你就被中斷了一會(huì),中斷結(jié)束后,中斷掉的任務(wù)才會(huì)被繼續(xù)運(yùn)行,同樣的你才能夠打飯;呵呵,這個(gè)比喻好像損了點(diǎn)。
關(guān)于這幾個(gè)任務(wù)之間的轉(zhuǎn)換,由于我在宿舍,我的電腦在老師辦公室,我用我同學(xué)的電腦,由于重裝的系統(tǒng),沒有裝OFFICE,我明天去實(shí)驗(yàn)室時(shí)補(bǔ)上咯。好了,今天關(guān)于UCOS就這么多吧。
|
|