Linux内核高精度定时器hrtimer
一、内核为高精度定时器重新设计了一套软件架构,它可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求的应用程序或内核驱动,下面简单介绍下hrtimer(high resolution timer)高精度定时器的使用。
二、hrtimer_init函数初始化定时器工作模式。clock_id一般是CLOCK_REALTIME、CLOCK_MONOTONIC,mode则可以是相对时间HRTIMER_MODE_REL,也可以是绝对时间HRTIMER_MODE_ABS。
void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
enum hrtimer_mode mode)
hrtimer_init(&hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
参数timer是hrtimer指针,
参数clock_id有如下常用几种选项:
CLOCK_REALTIME //实时时间,如果系统时间变了,定时器也会变
CLOCK_MONOTONIC //递增时间,不受系统影响
参数mode有如下几种选项:
HRTIMER_MODE_ABS = 0x0, /* 绝对模式 */
HRTIMER_MODE_REL = 0x1, /* 相对模式 */
HRTIMER_MODE_PINNED = 0x02, /* 和CPU绑定 */
HRTIMER_MODE_ABS_PINNED = 0x02, /* 第一种和第三种的结合 */
HRTIMER_MODE_REL_PINNED = 0x03, /* 第二种和第三种的结合 */
三、设定超时回调函数。定时器到时触发,function字段指定的回调函数会被调用,该函数的返回值为一个枚举值,它决定了该hrtimer是否需要被重新激活。使用hrtimer_forward函数设置下一次超时时间
hr_timer.function =&hrtimer_acc_callback;
static enum hrtimer_restart hrtimer_acc_callback(struct hrtimer *timer)
{
struct data *sdata;
queue_work(workqueue, &sdata->input_work);
hrtimer_forward(timer, ktime_get(), sdata->interval_time); /* 设置超时时间,当定时器超时后可以用该函数设置下一次超时时间 */
return HRTIMER_RESTART;
}
enum hrtimer_restart {
HRTIMER_NORESTART, /* 不重启定时器 */
HRTIMER_RESTART, /* 重启定时器 */
};
四、使用hrtimer_start激活该定时器。
/*
* 参数timer是hrtimer指针
* 参数tim是时间,可以使用ktime_set()函数设置时间,
* 参数mode和初始化的mode参数一致
*/
hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode);
/*
* 单位为秒和纳秒组合
*/
ktime_t ktime_set(const long secs, const unsigned long nsecs);
nsecs = MS_TO_NS(sdata->poll_ms);
sdata->interval_time = ktime_set(0, nsecs);
hrtimer_start(&sdata->hr_timer, sdata->interval_time, HRTIMER_MODE_REL);
五、hrtimer_cancel,取消一个hrtimer。
int hrtimer_cancel(struct hrtimer *timer);