概述
内核的时钟,关系内核的调度等。
高精度时钟和 传统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。
void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
enum hrtimer_mode mode);
二、激活定时器
使用hrtimer_start激活该定时器。根据time和mode参数的值计算hrtimer的超时时间,并设置到timer->expire域。 expire设置的是绝对时间,所以如果参数mode的值为HRTIMER_MODE_REL(即参数tim的值为相对时间),那么需要将tim的值修正为绝对时间:expire = tim + timer->base->get_time(),调用enqueue_hrtimer,将hrtimer加入到红黑树中。
int hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode);
m_kt=ktime_set(1, ( 5) * 1000000); //ktime_set函数参数:第一个是秒,第二个是纳秒,*1000000就是毫秒。
hrtimer_start(&hrtimer_test_timer,m_kt, HRTIMER_MODE_REL);
三、定时器处理接口
时钟回调函数:
static enum hrtimer_restart hrtimer_test_timer_poll(struct hrtimer *timer)
{
hrtimer_forward(timer, timer->base->get_time(), m_kt);//hrtimer_forward(timer, now, tick_period);
return HRTIMER_RESTART;
}
定时器一旦到期,function字段指定的回调函数会被调用,该函数的返回值为一个枚举值,它决定了该hrtimer是否需要被重新激活。
enum hrtimer_restart {
HRTIMER_NORESTART, /* Timer is not restarted */
HRTIMER_RESTART, /* Timer must be restarted */
};
把hrtimer的到期时间推进一个tick周期,返回HRTIMER_RESTART表明该hrtimer需要再次启动,以便产生下一个tick事件。
hrtimer_forward(timer, now, tick_period);
return HRTIMER_RESTART;
四、使用hrtimer_cancel取消一个hrtimer。
int hrtimer_cancel(struct hrtimer *timer);
内核机制
(6条消息) Linux内核时钟系统和定时器实现_walker沃克的博客-CSDN博客_itimerspec
一文入门linux内核高精度定时器hrtimer机制 - 知乎 (zhihu.com)
以arm为例子进行分析
盘一盘Linux内核中ns级别的高精度计时方法 - 知乎 (zhihu.com)
最后
以上就是忧郁母鸡为你收集整理的hrtimer使用步骤基本使用内核机制的全部内容,希望文章能够帮你解决hrtimer使用步骤基本使用内核机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复