SylixOS 系統Tick實現

1.Tick的做用

操做系統的Tick彷彿是人的脈搏,不停的向各個器官提供血液。Tick是操做系統實現調度的基礎,是分時調度的組成部分。函數

Tick對操做系統尤爲重要。例如,操做系統能夠爲多個任務許以不一樣數目的時間片,確保沒有一個任務能霸佔系統;或者把每一個定時器週期的某個時間範圍賦予特定的任務等;還有操做系統提供的各類定時功能,都與Tick有關。ui

在SylixOS中,Tick通常經過芯片自帶的Tick定時器或者通用定時器實現。spa

2.系統Tick實現

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);
}
相關文章
相關標籤/搜索