概念
內核支持兩種不同的時鐘機制。
64位系統時鐘--64位系統時鐘是內核基於時間的服務的基礎。這個時鐘又ticks計數,並以一個由應用程序指定的頻率遞增。
內核允許這個時鐘通過讀取timer的方式被直接訪問,也可以通過使用kernel timer或者超時機制來直接訪問。
32位硬件時鐘--32位硬件時鐘被用作系統時鐘步長的來源。這個時鐘用來測量未指定單元(cycles),並以一個由硬件指定的頻率遞增。
內核允許通過讀取timer來直接訪問這個時鐘
內核也提供一系列可以用來將時鐘轉換成標準時間單位的變量(seconds,millisenconds,nanoseconds等等),並在兩種時鐘單位之間切換。
目的
系統時鐘可以用於對時間精度要求不高的進程,比如實現時間限制或者時間延遲。
硬件時鐘可以用於對時間精度要求比系統時鐘高德進程,比如時間測量程序
使用
通過配置項CONFIG_SYS_CLOCK_TICKS_PER_SEC來指定每秒發生多少次時鐘。將其置0可以關閉所有系統時鐘和硬件時鐘功能。
將系統時鐘頻率值置大可以允許系統時鐘提供更加細粒度的計時,但也會增加內核處理時鐘的工作量。
例子(主要是瞭解api的使用):
以普通精度計時
下面的代碼使用系統時鐘來判定兩個點之間發生了多少時鐘週期:
int64_t time_stamp; int64_t ticks_spent; /* capture initial time stamp */ time_stamp = sys_tick_get(); /* do work for some (extended) period of time */ ... /* compute how long the work took & update time stamp */ ticks_spent = sys_tick_delta(&time_stamp);
以高進度計時
下面的代碼使用硬件時鐘來判定兩個點之間發生了多少時鐘週期
uint32_t start_time; uint32_t stop_time; uint32_t cycles_spent; uint32_t nanoseconds_spent; /* capture initial time stamp */ start_time = sys_cycle_get_32(); /* do work for some (short) period of time */ ... /* capture final time stamp */ stop_time = sys_cycle_get_32(); /* compute how long the work took (assumes no counter rollover) */ cycles_spent = stop_time - start_time; nanoseconds_spent = SYS_CLOCK_HW_CYCLES_TO_NS(cycles_spent);
APIs
內核在microkernel.h中提供內核時鐘API
sys_tick_get(),sys_tick_get_32()//讀取系統時鐘
sys_tick_delta(),sys_tick_delta_32()//計算在前一個系統時鐘後經歷了多長時間
sys_cycle_get_32()//讀取硬件時鐘
在microkernel.h和nanokernel.h中通用的內核時鐘變量:
sys_clock_ticks_per_sec//每秒系統時鐘週期
sys_clock_hw_cycles_per_sec//每秒硬件時鐘週期
sys_clock_us_per_tick//每個系統時鐘週期耗費多少ms
sys_clock_hw_cycles_per_tick//每個系統時鐘週期耗費多少個硬件時鐘週期