内核的时钟,关系内核的调度等。
高精度时钟和 传统tick如何并存的?
高精度时钟 在驱动硬件 所需要的精确延时场景外,还有哪些应用场景?
基本使用
变量定义: struct hrtimer hrtimer_test_timer; ktime_t m_kt
一:
初始化时钟: hrtimer_init(&hrtimer_test_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
设置超时后的回调函数:hrtimer_test_timer.function = hrtimer_test_timer_poll;
hrtimer_init函数初始化定时器工作模式。which_clock可以是CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_BOOTTIME中的一种,mode则可以是相对时间HRTIMER_MODE_REL,也可以是绝对时间HRTIMER_MODE_ABS。
二、激活定时器
使用hrtimer_start激活该定时器。根据time和mode参数的值计算hrtimer的超时时间,并设置到timer->expire域。 expire设置的是绝对时间,所以如果参数mode的值为HRTIMER_MODE_REL(即参数tim的值为相对时间),那么需要将tim的值修正为绝对时间:expire = tim + timer->base->get_time(),调用enqueue_hrtimer,将hrtimer加入到红黑树中。
三、定时器处理接口
时钟回调函数:
定时器一旦到期,function字段指定的回调函数会被调用,该函数的返回值为一个枚举值,它决定了该hrtimer是否需要被重新激活。
把hrtimer的到期时间推进一个tick周期,返回HRTIMER_RESTART表明该hrtimer需要再次启动,以便产生下一个tick事件。
四、使用hrtimer_cancel取消一个hrtimer。
int hrtimer_cancel(struct hrtimer *timer);
内核机制
一文入门linux内核高精度定时器hrtimer机制 - 知乎 (zhihu.com)
以arm为例子进行分析