hrtimer 是高分辨率kernel定时器。
下面是定时器结合工作队列的使用示例
static struct work_struct mc3xxx_work;//工作
static struct workqueue_struct *mc3xxx_workqueue = NULL;//工作队列
static struct hrtimer mc3xxx_bootcheck_kthread_timer;//kernel高精度定时器
…
//工作
static void mc3xxx_work_callback(struct work_struct *work) {
...
}
//定时器回调函数中 将工作加入队列 并唤醒在该队列上等待的线程 执行工作
enum hrtimer_restart mc3xxx_bootcheck_kthread_hrtimer_func(struct hrtimer *timer)
{
int ret = 0;
//将工作加入队列 并唤醒在该队列上等待的线程 执行工作
ret = queue_work(mc3xxx_workqueue, &mc3xxx_work);
}
初始化
{
//创建工作队列
mc3xxx_workqueue = create_singlethread_workqueue("mc3xxx_work");
//初始化工作,指定工作函数
INIT_WORK(&mc3xxx_work, mc3xxx_work_callback);
//初始化定时器 并指定工作模式
hrtimer_init(&mc3xxx_bootcheck_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL)
//设置定时器的回调函数 该回调函数为原子操作不能被中断
mc3xxx_bootcheck_kthread_timer.function = mc3xxx_bootcheck_kthread_hrtimer_func;
//定时器超时时间 1*1000ms 一秒
ktime = ktime_set(1, 0);
//启动定时器
hrtimer_start(&mc3xxx_bootcheck_kthread_timer, ktime, HRTIMER_MODE_REL);
}