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