前面讲到工作队列是一种可以将工作推后执行的一种机制,当我们希望某个工作以一个固定的周期去执行的时候可以使用延迟的工作队列来实现,通过分析延迟工作队列函数我们发现,它本质上也是通过注册内核定时器来保证这个延迟的时间的,
因此我们也可以使用内核定时器+工作队列的方式来代替延迟的工作队列。不过这种基于内核定时器实现的固定周期执行任务,因为内核定时器本身的精度关系,最高只能支持ms级别的精准度。如果需要更高更精确的延迟执行任务,延迟的工作队列可能不合适。
接下来简单说明一下延迟工作队列的创建,本质上和工作队列没有什么区别。
1.定义一个延迟的工作队列和任务对象 static struct workqueue_struct *ms_workqueue = NULL; static struct delayed_work ms_queue_work;
2.定义周期性执行的函数 void work_func(struct work_struct *work) { /*周期执行的操作,比如读取某些外设数据等*/ }
3.初始化工作队列 static int __init xxx_init(void) { my_workqueue= create_workqueue("1ms"); /*创建工作队列workqueue_struct,该函数会为cpu创建内核线程*/ INIT_DELAYED_WORK(&ms_queue_work,work_func); /*初始化延迟的工作work_struct,指定工作函数*/ queue_delayed_work(ms_workqueue, &ms_queue_work, 1); /*将工作加入到工作队列中,最终唤醒内核线程(比较常见的使用场景是在中断上半部去唤醒内核线程),第三个参数1是表示以1ms的周期去执行*/ return 0; }
4.注销工作队列
cancel_rearming_delayed_workqueue(ms_workqueue, &ms_queue_work);
destroy_workqueue(ms_workqueue);
点滴珍贵,重在积累,愿时光慢一点,再慢一点。