Linux内核高精度定时器hrtimer

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

你可能感兴趣的:(linux,linux,运维,服务器)