1.源代碼開放
嵌入式實時操作系統(tǒng)μC/OS-II公開全部的程序清單。絕大部分μC/OS-II的源代碼是用移植性很強(qiáng)的ANSI C編寫的,和微處理器硬件相關(guān)的那部分是用匯編語言編寫的。匯編語言編寫的部分已經(jīng)壓縮到最低限度,使得μC/OS-II便于移植到其他微處理器上。由于代碼的開放性,使用者可以清楚地了解該操作系統(tǒng)各個方面的設(shè)計細(xì)節(jié),通過自己修改源代碼,來構(gòu)造符合應(yīng)用需求的操作系統(tǒng)環(huán)境。
2.可移植性
μC/OS-II可以移植到許多微處理器上,條件是只要該微處理器有堆棧指針,有CPU內(nèi)部寄存器入棧、出棧指令。另外,使用C編譯器必須支持內(nèi)嵌匯編(inline assembly)或者該C語言可擴(kuò)展、連接模塊,使得關(guān)中斷、開中斷能在C語言程序中實現(xiàn)。μC/OS可以在絕大多數(shù)8位、16位、32位以至64位微處理器、微控制器、數(shù)字信號處理器(DSP)上運行。
3. 可固化性
μC/OS-Ⅱ是為嵌入式應(yīng)用而設(shè)計的,這就意味著,只要有固化手段(C編譯、連接、下載和固化),μC/OS-II就可以嵌入到產(chǎn)品中成為當(dāng)中的一部分。
4.可裁剪性
在實際應(yīng)用中,可以只使用μC/OS-II應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說某產(chǎn)品可以只使用幾個μC/OS-II功能調(diào)用,而另一個產(chǎn)品則使用了幾乎所有μC/OS-II的功能。這樣可以減少產(chǎn)品中的μC/OS-II所需的存儲空間(RAM和 ROM)。這種可裁剪性是靠條件編譯實現(xiàn)的。只要在用戶的應(yīng)用程序中(用#def ine constants語句)定義那些μC/OS-II中的功能是應(yīng)用程序需要的就可以了。
5.搶先式
μC/OS-II是搶先式的實時內(nèi)核。這就意味著μC/OS-II總是運行就緒條件下優(yōu)先級最高的任務(wù)。大多數(shù)商業(yè)內(nèi)核都是搶先式的,μC/OS-II在性能上和它們類似。
6.多任務(wù)
μC/OS-Ⅱ可以管理64個任務(wù),然而,目前這一版本保留8個給系統(tǒng),應(yīng)用程序最多可以有56個任務(wù)。
賦予每個任務(wù)的優(yōu)先級必須是不同的,這意味著μC/OS-II不支持時間片輪轉(zhuǎn)調(diào)度法(round-robin Scheduling)。該調(diào)度法適用于調(diào)度優(yōu)先級平等的任務(wù)。
7.可確定性
全部μC/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間具有可確定性。也就是說,全部μC/OS-II的函數(shù)調(diào)用與服務(wù)執(zhí)行時間是可知的。進(jìn)而言之,μC/OS-II服務(wù)的執(zhí)行時間不依賴于應(yīng)用程序任務(wù)的多少。
8.任務(wù)棧
每個任務(wù)有自己獨立的棧,μC/OS-II允許每個任務(wù)有不同的??臻g。以便壓低應(yīng)用程序?qū)AM的需求。使用μC/OS-II的棧空間校驗函數(shù),可以確定每個任務(wù)到底需要多少棧空間。
9.系統(tǒng)服務(wù)
μC /OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與釋放以及時間相關(guān)函數(shù)等。
10.中斷管理
在μC/OS-II中執(zhí)行中斷時可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被該中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255層。
11.穩(wěn)定性與可靠性
μC/OS-II是基于μC/OS的,μC/OS-II與μC/OS的內(nèi)核是一樣的,只不過提供了更多的功能。自1992年以來μC/OS已經(jīng)有好幾百個商業(yè)應(yīng)用。
下面給出一個μC/OS-II創(chuàng)建任務(wù)的實例,使讀者可以對在μC/OS-II操作系統(tǒng)下的任務(wù)建立有一個初步的概念。
【例5.1】多任務(wù)創(chuàng)建。
以下函數(shù)實現(xiàn)在μC/OS-II中創(chuàng)建任務(wù)Task1和Task2,任務(wù)堆棧為Stack1和Stack2,任務(wù)的優(yōu)先為2和3。
void main(void )
{
OSInit(); /*初始化μC/OS-II*/
OSTaskCreate(Task1, (void )0, &Stack1[STACKSIZE - 1], 2);/*創(chuàng)建Task1 任務(wù)*/
OSTaskCreate(Task2, (void *)0, &Stack2[STACKSIZE - 1], 3);/*創(chuàng)建Task2 任務(wù)*/
OSStart();/*開始任務(wù)調(diào)度,注意OSStart()函數(shù)不會返回*/
}
任務(wù)Task1和Task2相當(dāng)于兩個無限循環(huán)的函數(shù),程序員可將要實現(xiàn)的功能放在兩個任務(wù)中。