[Linux 基础] -- Linux内核高精度定时器hrtimer使用实例

一、

内核为高精度定时器重新设计了一套软件架构,它可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求的应用程序或者内核驱动,以下学习使用 hrtimer(high resolution timer)高精度定时器。

二、

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);

三、设置超时回调函数

timer.function = hr_callback;

四、

使用 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);

五、使用 hrtimer_cancel 取消一个 hrtimer

int hrtimer_cancel(struct hrtimer *timer);

六、定时器一旦到期,function 字段指定的回调函数会被调用,该函数的返回值为一个枚举值,它决定了该 hrtimer 是否需要被重新激活。

enum hrtimer_restart {
    HRTIMER_NORESTART,
    HRTIMER_RESTART,
};

七、把 hrtimer 的到期时间推进一个 tick 周期,返回 HRTIMER_RESTART 表明该 hrtimer 需要再次启动,以便产生一个 tick 事件。

    hrtimer_forward(timer, now, tick_period);
    return HRTIMER_RESTART;
}

猜你喜欢

转载自blog.csdn.net/u014674293/article/details/111311268