zephyr-內核時鐘

概念

內核支持兩種不同的時鐘機制。

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//每個系統時鐘週期耗費多少個硬件時鐘週期





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章