μC/OSII中軟件定時器的優(yōu)缺點與改進
2.2.4 回調函數任務OSTmr_TaskCallback()
在源文件tmr.c中加入回調函數任務OSTmr_TaskCallback(),根據定時器就緒表中的優(yōu)先級執(zhí)行相應回調函數,回調函數任務的結構如下所示:
static voidOSTmr_TaskCallback(void *p_arg) {……/*變量定義*/
for (;;){//請求信號量OSTmrSemCallback
OSSemPend(OSTmrSemCallback, 0, err);
OSTmr_Lock();/*定時器上鎖*/
while (OSTmrRdyGrp) {
……/*從定時器就緒表中得到最高優(yōu)先級的定時器回調函數*/
……/*刪除就緒表中的占有位*/
OSTmr_Unlock(); /*定時器上鎖*/
pfnct = OSTmrCall[prio].OSTmrCallback;
(*pfnct)((void *)(OSTmrCall[prio].OSTmr),OSTmrCall[prio].OSTmrCallbackArg); /*執(zhí)行回調函數*/
OSTmr_Lock(); /*定時器上鎖*/
}
OSTmr_Unlock();/*定時器解鎖*/
}
}
由以上代碼可知,訪問就緒表時定時器上鎖,而執(zhí)行回調函數時處于定時器解鎖狀態(tài)。如果回調函數執(zhí)行時間較長,在下一個軟件定時器節(jié)拍到來時,定時器掃描任務可以得到及時的執(zhí)行,當前回調函數執(zhí)行完成后,可以及時得執(zhí)行就緒表中最高優(yōu)先級定時器的回調函數。由此可以看出,高優(yōu)先級定時器的回調函數得到及時執(zhí)行,系統的實時性提高。
實驗測試發(fā)現,在回調函數任務OSTmr_TaskCallback中,使用任務調度上鎖與解鎖比使用定時器上鎖與解鎖(即信號量的請求)執(zhí)行速度快一些。畢竟回調函數任務的優(yōu)先級很高(一般僅次于定時器掃描任務OSTmr_Task的優(yōu)先級),所以使用任務調度鎖定比定時器鎖定要好一些。當然,還可以使用開關中斷的方式對就緒表進行訪問,可以根據實際情況選擇使用哪種方式。
3 實驗測試
本次實驗使用軟件開發(fā)環(huán)境IAR 5.30,以基于CortexM3內核的路虎LPC1768開發(fā)板作為硬件實驗平臺[6],對實時操作系統μC/OSII 2.86進行改進。
對改進后的操作系統進行測試,在主函數中創(chuàng)建一個啟動任務,在啟動任務中創(chuàng)建4個周期定時器(系統中“時間輪”數設為4),賦予不同優(yōu)先級與定時值,每個定時器控制一個LED的閃爍,啟動這4個定時器。在啟動函數中創(chuàng)建4個任務,每個任務也是控制一個LED燈的閃爍(利用任務延時),之后啟動任務掛起。利用μC/OSII CSPY插件觀察各定時器的運行情況,如圖2所示。
圖2 軟件定時器運行界面
經實驗測試,系統運行正常,定時器回調函數得到及時的執(zhí)行,系統實時性得到很大的提高。
4 結語
軟件定時器改進后,定時器任務的執(zhí)行時間確定,僅與同時完成定時的定時器數目有關,對處于就緒表中的定時器回調函數按優(yōu)先級執(zhí)行,使高優(yōu)先級定時器的回調函數得到及時的執(zhí)行,提高了系統的實時性。
評論