μC/OSII原有的時(shí)鐘管理系統(tǒng)類似于Linux,但是比Linux簡(jiǎn)單得多。它僅向用戶提供一個(gè)周期性的信號(hào)OSTime,時(shí)鐘頻率可以設(shè)置在10~100 Hz,時(shí)鐘硬件周期性地向CPU發(fā)出時(shí)鐘中斷,系統(tǒng)周期性響應(yīng)時(shí)鐘中斷,每次時(shí)鐘中斷到來時(shí),中斷處理程序更新一個(gè)全局變量OSTime。μC/OSII時(shí)鐘中斷服務(wù)程序的核心是調(diào)用OSTimeTick ()函數(shù)。OSTimeTick ()函數(shù)用來判斷延時(shí)任務(wù)是否延時(shí)結(jié)束從而將其置于就緒態(tài)。其程序偽代碼如下:
void OSTimeTick(void) {
OSTimeTickHook();// 調(diào)用用戶定義的時(shí)鐘節(jié)拍外連函數(shù)
while { (除空閑任務(wù)外的所有任務(wù))
OS_ENTER_CRITICAL();//關(guān)中斷
對(duì)所有任務(wù)的延時(shí)時(shí)間遞減;
掃描時(shí)間到期的任務(wù),并且喚醒該任務(wù);
OS_EXIT_CRITICAL();//開中斷
指針指向下一個(gè)任務(wù);
}
OSTime++;//累計(jì)從開機(jī)以來的時(shí)間
}
在μC/OSII的時(shí)鐘節(jié)拍函數(shù)中,需要執(zhí)行用戶定義的時(shí)鐘節(jié)拍外連函數(shù)OSTimeTickHook (),以及對(duì)任務(wù)鏈表進(jìn)行掃描并且遞減任務(wù)的延時(shí)。這樣就造成了時(shí)鐘節(jié)拍函數(shù)OSTimeTick ()有兩點(diǎn)不足:
、 在時(shí)鐘中斷中處理額外的任務(wù)OSTimeIickHook (),這樣增加了中斷處理的負(fù)擔(dān),影響了定時(shí)服務(wù)的準(zhǔn)確性;
、 在關(guān)中斷情況下掃描任務(wù)鏈表,任務(wù)越多所需要時(shí)間越長(zhǎng),而長(zhǎng)時(shí)間關(guān)中斷對(duì)中斷響應(yīng)有不利影響,是中斷處理應(yīng)當(dāng)避免的。
(1)公開源碼:是為數(shù)不多的公開源碼的RTOS,給二次開發(fā)和移植提供了可能;
(2)可移植性強(qiáng):μC/OSII絕大多數(shù)源碼用ANSI C編寫,少量用匯編語言編寫,具有較強(qiáng)的移植性;
(3)可固化:微小內(nèi)核,可以和應(yīng)用程序一起固化到FLASHROM中;