先有低精度定时器,后来引入了高精度定时器。低精度定时器只能提供毫秒级别的定时时间,因为它实际上是依赖于jiffies的,一个jiffies的时间,就是其能够提供的最小定时时间,比如CONFIG_HZ配置为250,那么一个jiffies就是4ms,所以低精度定时器的精度就是4ms;而高精度定时器则不一样,它不依赖于jiffies,甚至jiffies是依赖于高精度定时器的,因为jiffies的累加实际上也是通过一个特殊的高精度定时器来实现的,高精度定时器只依赖于硬件timer,所以可以提供纳秒级别的精度。那么除了从函数接口上看到的定时事件精度的差异之外,高精度定时器和低精度定时器还有哪些不一样呢?下面通过实例来探讨一下。
- 高精度定时器测试代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/time64.h>
#include <linux/hrtimer.h>
#include <linux/timekeeper_internal.h>
#define GET_TIME_SAMPLES_CNT 32
#define HRTIMER_TIMEOUT_NSECOND 1000000000
static int g_get_time_index = 0;
static struct hrtimer g_hrtimer;
static struct timespec64 current_time[GET_TIME_SAMPLES_CNT];
static enum hrtimer_restart timer_test_func(struct hrtimer *hrtimer)
{
if(g_get_time_index >= GET_TIME_SAMPLES_CNT){
printk("timer test done!\n");
return HRTIMER_NORESTART;
}
hrtimer_forward_now(hrtimer, ns_to_ktime(HRTIMER_TIMEOUT_NSECOND));
getnstimeofday64(¤t_time[g_get_time_index++]);
return HRTIMER_RESTART;
}
static int __init hrtimer_test_init(void)
{
hrtimer_init(&g_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
g_hrtimer.function = timer_test_func;
hrtimer_start(&g_hrtimer, ns_to_ktime(HRTIMER_TIMEOUT_NSECOND), HRT