操做系統的Tick彷彿是人的脈搏,不停的向各個器官提供血液。Tick是操做系統實現調度的基礎,是分時調度的組成部分。函數
Tick對操做系統尤爲重要。例如,操做系統能夠爲多個任務許以不一樣數目的時間片,確保沒有一個任務能霸佔系統;或者把每一個定時器週期的某個時間範圍賦予特定的任務等;還有操做系統提供的各類定時功能,都與Tick有關。ui
在SylixOS中,Tick通常經過芯片自帶的Tick定時器或者通用定時器實現。spa
SylixOS系統Tick一般是採用通用定時器的週期性中斷實現,一次中斷表示一個Tick。操作系統
Tick的初始化在內核啓動時被調用,具體調用流程如圖2.1所示。線程
l 系統啓動時調用API_KernelStart,API_KernelPrimaryStart函數進入系統內核;it
l 在API_KernelPrimaryStart函數中最後調_KernelPrimaryEntry函數啓動內核;基礎
l 在_KernelPrimaryEntry函數中調bspTickInit函數初始化操做系統時鐘。配置
圖 2.1 Tick初始化定時器
bspTickInit函數即爲SylixOSTick具體實現,其大體流程如圖2.2所示。程序
l 經過API_KernelStartParam函數修改內核啓動參數進行配置,將數據保存於全局結構體中。例如:參數「hz=100」表示設置系統Tick頻率爲10ms;
l 對指定定時器進行初始化,設置定時時長並使能定時器中斷;
l 定時器產生中斷時會產生調度,在中斷處理函數中通知內核Tick。
圖2.2 Tick具體實現
Tick初始化函數對定時器進行初始化並設置定時時長,使能定時器中斷,如程序清單3.1所示。
程序清單3.1 Tick初始化
VOID bspTickInit (VOID) { … GuiFullCnt = sysClockGet(SYS_PCLK) * 1000 * 1000 / LW_TICK_HZ; Gui64NSecPerCnt7 = ((1000 * 1000 * 1000 / LW_TICK_HZ) << 7) / GuiFullCnt; tickETimerInit(HW_ETIMER, GuiFullCnt); /* 系統TICK的頻率爲LW_TICK_HZ */ API_InterVectorConnect(ulVector, (PINT_SVR_ROUTINE)__tickTimerIsr, LW_NULL, "tick_timer"); API_InterVectorEnable(ulVector); }
定時器產生中斷時,會產生調度,並在中斷處理函數中進行內核Tick通知,如程序清單3.2 所示。
程序清單3.2 Tick中斷服務函數
static irqreturn_t __tickTimerIsr (VOID) { etimerIsr(HW_ETIMER); API_KernelTicksContext(); /* 保存被時鐘中斷的線程控制塊 */ #if TICK_IN_THREAD > 0 API_ThreadResume(htKernelTicks); #else API_KernelTicks(); /* 內核 TICKS 通知 */ API_TimerHTicks(); /* 高速 TIMER TICKS 通知 */ #endif /* TICK_IN_THREAD > 0 */ return (LW_IRQ_HANDLED); }