GUI_Delay()函數函數
使用GUI_Delay()函數時,對於其延時時間不肯定,明明設置爲最小值1,延時時間spa
仍舊太長,不能達到需求。遂決定研究明白其實現機理。rem
uC/OS-II使用OSTimeDly()函數實現延時,其單位是OS_TICKS,即延時多少個系統節io
拍。GUI使用GUI_Delay()函數延時,同時也實現顯示刷新;基於同一個平臺,估計也會class
調用OSTimeDly()函數以實現基本的延時功能。變量
下面分析GUI_Delay()函數功能擴展
void GUI_Delay(int Period) { 循環
int EndTime = GUI_GetTime()+Period; 程序
int tRem; /* remaining Time */ im
GUI_ASSERT_NO_LOCK();
while (tRem = EndTime- GUI_GetTime(), tRem>0) {
GUI_Exec();
GUI_X_Delay((tRem >5) ? 5 : tRem);
}
}
首先EndTime變量得到延時結束時間;
使用一個while循環,在結束時間以前循環調用GUI_Exec()函數和GUI_X_Delay()
函數;
前者是GUI的刷新函數,保證在延時過程當中不會中止GUI任務處理。後者就是咱們要
分析的延時函數GUI_X_Delay了。
參數用三目變量,每次送給延時的參數最大是5;
跟蹤GUI_X_Delay()函數,在GUI_X_uCOS.C文件中實現。
void GUI_X_Delay (int period)
{
INT32U ticks;
ticks = (period * 1000) / OS_TICKS_PER_SEC;
OSTimeDly((INT16U)ticks);
}
能夠看到,在GUI_X_Delay()函數中調用了系統延時函數OSTimeDly(),就像前面
咱們說過的,OSTimeDly()函數的延時時間是系統節拍,若是要改變GUI_Delay()函數
的延時時間,就須要今後着手。
再看看延時時間的取值:OS_TICKS_PER_SEC在OS_CFG.H中設置爲100,即每秒產
生100個系統節拍。ticks變量在這裏被擴展了10倍。即GUI_Delay()函數傳遞一個延時
參數1,而實際的延時時間就是10個節拍即100毫秒。在這個延時時間以內,調用GUI_Delay
()函數的任務就不能執行,使得響應速度慢。爲保持源程序的風格一致,這裏改period
的倍數爲100,使GUI_Delay()函數的延時時間和OSTimeDly()函數時間單位一致,提
高了響應速度加強其易用性。