μC/OSII中軟件定時(shí)器的優(yōu)缺點(diǎn)與改進(jìn)
μC/OSII具有小巧、性能穩定、開(kāi)源等眾多優(yōu)點(diǎn),并且μC/OSII大部分用ANSI C語(yǔ)言編寫(xiě),系統的移植非常容易。在μC/OSII I2.81及以后的版本中[2],加入了對軟件定時(shí)器的支持,使得μC/OSII操作系統更加完善。
本文引用地址:http://dyxdggzs.com/article/162162.htmμC/OSII是一種基于優(yōu)先級的搶占式操作系統,實(shí)時(shí)性很強。而系統中軟件定時(shí)器沒(méi)有優(yōu)先級,回調函數順序執行,這樣就降低了系統的實(shí)時(shí)性。因此,本文對軟件定時(shí)器進(jìn)行改進(jìn),定時(shí)器中加入優(yōu)先級,回調函數按優(yōu)先級執行,從而提高系統的實(shí)時(shí)性。
1 對軟件定時(shí)器的介紹
μC/OSII系統中的時(shí)間管理功能包括任務(wù)延時(shí)與軟件定時(shí)器,而軟件定時(shí)器的主要作用是,對函數周期性或者一次性執行的定時(shí),利用軟件定時(shí)器控制塊與“定時(shí)器輪”管理軟件定時(shí)器。定時(shí)器控制塊的結構如同任務(wù)控制塊,創(chuàng )建一個(gè)定時(shí)器時(shí),從空閑定時(shí)器控制塊鏈表中得到一個(gè)空閑控制塊,并對其賦值。
軟件定時(shí)器也需要一個(gè)時(shí)鐘節拍驅動(dòng),而這個(gè)驅動(dòng)一般是硬件實(shí)現的,一般使用μC/OSII操作系統中任務(wù)延時(shí)的時(shí)鐘節拍來(lái)驅動(dòng)軟件定時(shí)器。每個(gè)時(shí)鐘節拍OSTmrCtr(全局變量,初始值為0)增1, 當OSTmrCtr的值等于為OS_TICKS_PER_SEC /OS_TMR_CFG_TICKS_PER_SEC(此兩者的商決定軟件定時(shí)器的頻率)時(shí),調用函數OSTmrSignal(),此函數發(fā)送信號量OSTmrSemSignal(初始值為0,決定軟件定時(shí)器掃描任務(wù)OSTmr_Task的運行)。也就是說(shuō),對定時(shí)器的處理不在時(shí)鐘節拍中斷函數中進(jìn)行,而是以發(fā)生信號量的方式激活任務(wù)OSTmr_Task(具有很高的優(yōu)先級)。任務(wù)OSTmr_Task對定時(shí)器進(jìn)行檢測處理,包括定時(shí)器定時(shí)完成的判斷、回調函數的執行。
μC/OSII 2.86中與軟件定時(shí)器相關(guān)的函數包括:
?、?軟件定時(shí)器內部靜態(tài)函數。獲取與釋放定時(shí)器控制塊函數OSTmr_Alloc()、OSTmr_Free();定時(shí)器插入相應“時(shí)間輪”組函數OSTmr_Link();從相應“時(shí)間輪”組中刪除定時(shí)器函數OSTmr_Unlink();軟件定時(shí)器任務(wù)初始化函數OSTmr_InitTask();定時(shí)器掃描任務(wù)OSTmr_Task;定時(shí)器上鎖與解鎖函數OSTmr_Lock()與OSTmr_Unlock()(在μC/OSII 2.91中,此兩函數被任務(wù)調度鎖定與解鎖函數代替)。
?、?定時(shí)器外部接口函數。定時(shí)器創(chuàng )建與刪除函數OSTmrCreate()、OSTmrDel();定時(shí)器啟動(dòng)與停止函數OSTmrStart()、OSTmrStop();定時(shí)器剩余時(shí)間與當前狀態(tài)查詢(xún)函數OSTmrRemainGet()、OSTmrStateGet();軟件定時(shí)器的初始化OSTmr_Init();發(fā)送信號量OSTmrSemSignal函數OSTmrSignal();定時(shí)器名稱(chēng)查詢(xún)函數OSTmrNameGet()。
由于軟件定時(shí)器的回調函數的執行都是在任務(wù)OSTmr_Task中執行,如果多個(gè)定時(shí)器同時(shí)定時(shí)完成,則在定時(shí)器任務(wù)中執行多個(gè)定時(shí)器的回調函數,因此定時(shí)器任務(wù)的執行時(shí)間不確定。而且定時(shí)器回調函數是順序執行的,如果某個(gè)定時(shí)器回調函數需要盡快執行以實(shí)現精確定時(shí),就難以實(shí)現了。由于各個(gè)定時(shí)器沒(méi)有優(yōu)先級,因此了影響系統的實(shí)時(shí)性。
2 對軟件定時(shí)器的改進(jìn)
為提高軟件定時(shí)器回調函數執行的實(shí)時(shí)性,給每個(gè)定時(shí)器賦予一個(gè)優(yōu)先級。當定時(shí)完成時(shí),并且定時(shí)器的回調函數不為空,則把定時(shí)器的優(yōu)先級寫(xiě)于軟件定時(shí)器就緒表中。任務(wù)OSTmr_Task對相應“時(shí)間輪”檢查結束后,如果在掃描各個(gè)定時(shí)器前軟件定時(shí)器就緒表為零而掃描之后不為零,則發(fā)送信號量激活回調函數任務(wù)OSTmr_TaskCallback。在此任務(wù)中,回調函數根據軟件定時(shí)器就緒表中的優(yōu)先級執行相應的回調函數,這樣就提高了系統的實(shí)時(shí)性。
2.1 對軟件定時(shí)器相關(guān)數據結構改進(jìn)
?、?定義結構體OS_TMR_CALL,存儲定時(shí)器的回調函數、函數的參數、定時(shí)器指針,形式如下:
typedefstructos_tmr_call {
OS_TMR_CALLBACKOSTmrCallback; /*回調函數*/
void *OSTmrCallbackArg;/*回調函數指針*/
OS_TMR *OSTmr; /*定時(shí)器指針*/
} OS_TMR_CALL;
在頭文件ucos_ii.h中,定義OSTmrCallbackTbl[OS_TMR_CFG_MAX],OS_TMR_CFG_MAX表示系統中配置的軟件定時(shí)器數量。
?、?在軟件定時(shí)器控制塊中加入成員變量OSTmrPrio(定時(shí)器優(yōu)先級),刪去變量OSTmrCallback(回調函數)、OSTmrCallbackArg(回調函數參數),為了測試的方便,可暫不刪除這兩個(gè)變量。
?、?定義定時(shí)器就緒表:
INT8UOSTmrRdyGrp;
INT8UOSTmrRdyTbl[OS_TMR_CFG_MAX/8 + 1];
當定時(shí)器定時(shí)完成時(shí),把定時(shí)器優(yōu)先級寫(xiě)入就緒表,回調函數任務(wù)根據優(yōu)先級執行回調函數。
?、?定義信號量OSTmrSemCallback(初始值0 ),當定時(shí)完成后,發(fā)送此信號量,激活回調函數任務(wù),以執行回調函數。
評論