在嵌入式應(yīng)用系統(tǒng)的設(shè)計中,實時操作系統(tǒng)的應(yīng)用越來越受到重視。目前市場上可以選擇的實時操作系統(tǒng)很多,一些商用系統(tǒng)為用戶提供了非常豐富的功能,不僅包括實時內(nèi)核,同時還包括輸入輸出管理、文件系統(tǒng)、網(wǎng)絡(luò)、調(diào)試軟件等。但是對于中小型的嵌入式應(yīng)用系統(tǒng)來說,商用實時操作系統(tǒng)的成本太高,所以采用免費軟件是最好的選擇。uC/OS-Ⅱ是一個免費的源代碼公開的實時嵌入式內(nèi)核,它提供了實時系統(tǒng)所需的基本功能。其包含全部功能的核心部分代碼只占用8.3K字節(jié),而且由于uC/OS-Ⅱ是可裁剪的,所以用戶系統(tǒng)中實際的代碼最少可達2.7K字節(jié),可謂短小精悍。uC/OS-Ⅱ不僅使用戶得到廉價的解決方案,而且由于uC/OS-Ⅱ的開源特性,用戶還可以針對自己的硬件優(yōu)化代碼,以獲得更好的性能。
uC/OS-Ⅱ?qū)嶋H上是一個實時操作系統(tǒng)內(nèi)核,只包含了任務(wù)調(diào)度、任務(wù)管理、時間管理、內(nèi)存管理和任務(wù)間的通信與同步等基本功能。沒有提供輸入輸出管理、文件系統(tǒng)、網(wǎng)絡(luò)之類的額外服務(wù)。但是由于uC/OS-Ⅱ的可移植性和開源性,用戶可以自己添加所需的各種服務(wù)。目前,已經(jīng)出現(xiàn)了第三方為uC/OS-Ⅱ開發(fā)的文件系統(tǒng)、TCP/IP協(xié)議棧、用戶顯示接口等。
uC/OS-Ⅱ的任務(wù)調(diào)度是按搶占式多任務(wù)系統(tǒng)設(shè)計的,即它總是執(zhí)行處于就緒條件下優(yōu)先級最高的任務(wù)。為了簡化系統(tǒng)的設(shè)計,uC/OS-Ⅱ規(guī)定所有任務(wù)的優(yōu)先級必須不同,任務(wù)的優(yōu)先級同時也唯一地標識了該任務(wù)。即使兩個任務(wù)的重要性是相同的,它們也必須有優(yōu)先級上的差異,這也就意味著高優(yōu)先級的任務(wù)在處理完成后必須進入等待或掛起狀態(tài),否則低優(yōu)先級的任務(wù)永遠也不可能執(zhí)行。系統(tǒng)通過兩種方法進行任務(wù)調(diào)度:一是時鐘節(jié)拍或其它硬件中斷到來后,系統(tǒng)會調(diào)用函數(shù)OSIntCtxSw()執(zhí)行切換功能;二是任務(wù)主動進入掛起或等待狀態(tài),這時系統(tǒng)通過發(fā)軟中斷命令或依靠處理器執(zhí)行陷阱指令來完成任務(wù)切換,中斷服務(wù)例程或陷阱處理程序的向量地址必須指向函數(shù)OSCtxSw()。
uC/OS-Ⅱ最多可以管理64個任務(wù),這些任務(wù)通常都是一個無限循環(huán)的函數(shù)。在目前的版本中,作者保留了優(yōu)先級為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO的任務(wù),所以用戶可以同時擁有56個任務(wù)。uC/OS-Ⅱ提供了任務(wù)管理的各種函數(shù)調(diào)用,包括創(chuàng)建任務(wù)、刪除任務(wù)、改變?nèi)蝿?wù)的優(yōu)先級、掛起和恢復(fù)任務(wù)等。系統(tǒng)初始化時會自動產(chǎn)生兩個任務(wù):一是空閑任務(wù)OSTaskIdle(),它的優(yōu)先級最低為OS_LOWEST_PRIO,該任務(wù)只是不停地給一個32位的整型變量加一;另一個是統(tǒng)計任務(wù)OSTaskStat(),它的優(yōu)先級為OS_LOWEST_PRIO-1,該任務(wù)每秒運行一次,負責(zé)計算當(dāng)前CPU的利用率。
uC/OS-Ⅱ要求用戶提供一個稱為時鐘節(jié)拍的定時中斷,該中斷每秒發(fā)生10至100次,時鐘節(jié)拍的實際頻率是由用戶控制的。任務(wù)申請延時或超時控制的計時基準就是該時鐘節(jié)拍。該時鐘節(jié)拍同時還是任務(wù)調(diào)度的時間基準。uC/OS-Ⅱ提供了與時鐘節(jié)拍相關(guān)的系統(tǒng)服務(wù),允許任務(wù)延時一定數(shù)量的時鐘節(jié)拍或按時、分、秒、毫秒進行延時。
對于一個多任務(wù)操作系統(tǒng)來說,任務(wù)間的通信與同步是必不可少的。uC/OS-Ⅱ提供了四種同步對象,分別是信號量、郵箱、消息隊列和事件。通過郵箱和消息隊列還可以進行任務(wù)間的通信。所有的同步對象都有相應(yīng)的創(chuàng)建、等待、發(fā)送的函數(shù)。但這些對象一旦創(chuàng)建就不能刪除,所以要避免創(chuàng)建過多的同步對象以節(jié)約系統(tǒng)資源。
為了消除多次動態(tài)分配與釋放內(nèi)存所引起的內(nèi)存碎片,uC/OS-Ⅱ把連續(xù)的大塊內(nèi)存按分區(qū)來管理。每個分區(qū)中都包含整數(shù)個大小相同的內(nèi)存塊,但不同分區(qū)之間內(nèi)存塊的大小可以不同。用戶需要動態(tài)分配內(nèi)存時,選擇一個適當(dāng)?shù)姆謪^(qū),按塊來分配內(nèi)存。釋放內(nèi)存時將該塊放回它以前所屬的分區(qū)。這樣,就能有效解決內(nèi)存碎片的問題。
uC/OS-Ⅱ的大部分代碼是用ANSI C寫成的,只有與處理器硬件相關(guān)的一部分代碼用匯編語言編寫。所以uC/OS-Ⅱ的移植性很強,可以在絕大多數(shù)8位、16位、32位微處理器、數(shù)字信號處理器上運行。uC/OS-Ⅱ的移植并不復(fù)雜,只要編寫4個匯編語言的函數(shù)、6個C函數(shù)再定義3個宏和1個常量,這些宏和函數(shù)都非常簡單,其中的5個C函數(shù)甚至只需聲明不必包含代碼。用戶可以根據(jù)需要自己編寫移植代碼。uC/OS-Ⅱ的網(wǎng)站上(www.uCOS-II.com)有針對不同微處理器的移植代碼可供下載。目前網(wǎng)站上提供的移植實例包括Intel公司的80x86、8051、80196等,Motorola公司的PowerPC、68K、CPU32等,TI公司的TMS320系列,Zilog公司的z-80、z-180,還包括Analog Device公司、ARM公司、日立公司、三菱公司、飛利浦公司和西門子公司的各種微處理器。
uC/OS-Ⅱ是在PC機上開發(fā)的,C編譯器使用的是Borland C/C++ 3.1版,而且PC機是大家最熟悉的開發(fā)環(huán)境,所以在PC機上學(xué)習(xí)和使用uC/OS-Ⅱ是非常方便的。uC/OS-Ⅱ的網(wǎng)站上也提供了在PC機上運行uC/OS-Ⅱ的源代碼。但是由于C/C++運行庫和DOS本身的限制,在PC上運行uC/OS-Ⅱ時需要注意兩個問題。3y=k1@
第一,由于DOS下的C編譯器提供的運行庫沒有考慮多線程應(yīng)用的問題,運行庫中的全局變量和部分函數(shù)只適用于單線程。這些變量和函數(shù)包括:errno、_doserrno、strtok、strerror、tmpnam、tmpfile、asctime、gmtime、ecvt、fcvt等。在uC/OS-Ⅱ中使用這些函數(shù)時要小心,要避免兩個任務(wù)同時調(diào)用這些函數(shù),或者用信號量同步對這些函數(shù)的調(diào)用。+&i
第二,DOS是不能重入的,就是說正在調(diào)用DOS服務(wù)期間,是不能再次調(diào)用DOS的,如果又進行了DOS調(diào)用,那么肯定會引起系統(tǒng)崩潰。uC/OS-Ⅱ啟動多任務(wù)后,如果兩個以上的任務(wù)進行了DOS調(diào)用或者調(diào)用了需要DOS的C/C++運行庫(如:printf、scanf等等),就有可能引起DOS重入。所以在uC/OS-Ⅱ中,可以調(diào)用BIOS或直接操縱硬件,但要盡量減少DOS調(diào)用。如果必須要用DOS,最好只有一個調(diào)用DOS的任務(wù),或者用信號量進行同步。.
uC/OS-Ⅱ作為一個源代碼公開的實時嵌入式內(nèi)核,對我們學(xué)習(xí)和使用實時操作系統(tǒng)提供了極大的幫助。而uC/OS-Ⅱ自身也因此獲得了快速的發(fā)展,許多開發(fā)者已經(jīng)成功地把uC/OS-Ⅱ應(yīng)用于自己的系統(tǒng)之中。隨著uC/OS-Ⅱ的不斷完善,它必將會有更加廣闊的應(yīng)用空間。
(審核編輯: 小王子)
分享