hrtimer使用步骤

本文围绕Linux内核高精度时钟展开,探讨了高精度时钟与传统tick并存问题及其他应用场景。介绍了基本使用方法,包括变量定义、初始化时钟、激活定时器、定时器处理接口及取消定时器等操作,还提及了内核机制相关参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核的时钟,关系内核的调度等。

高精度时钟和 传统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沃克的博客-优快云博客_itimerspec 
 

一文入门linux内核高精度定时器hrtimer机制 - 知乎 (zhihu.com)    

以arm为例子进行分析

盘一盘Linux内核中ns级别的高精度计时方法 - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

proware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值