概念
内核支持两种不同的时钟机制。
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//每个系统时钟周期耗费多少个硬件时钟周期