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//每个系统时钟周期耗费多少个硬件时钟周期





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值