11. linux 驱动工作队列相关API
不是所有的驱动程序都必须有自己的工作队列。驱动程序可以使用内核提供的缺省工作队列。由于这个工作队列由很多驱动程序共享,任务可能会需要比较长一段时间才能开始执行。为了解决这一问题,工作函数中的延迟应该保持最小或者不要延时。
需要特别注意的是缺省队列对所有驱动程序来说都是可用的,但是只有经过GP许可的驱动程序可以用自定义的工作队列。
- 创建工作队列
每个工作队列有一个专门的线程,所有来自运行队列的任务在进程的上下文中运行(这样它们可以休眠)。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个工作队列。
//创建工作队列
struct workqueue_struct *create_workqueue(const char *name);
- 创建工作队列的任务
工作队列任务可以在编译时或者运行时创建
//编译是创建
DECLARE_WORK(name, void (*function)(void *), void *data);
//运行时创建
INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);
- 将任务添加到工作队列中
//添加到指定工作队列
int queue_work(struct workqueue_struct *queue, struct work_struct *work);
<br>
int queue_delayed_work(struct workqueue_struct *queue, struct work_struct
<br>
*work, unsigned long delay);
//添加到内核默认工作队列
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct work_struct *work, unsigned long delay);
说明:
delay
: 保证至少在经过一段给定的最小延迟时间以后,工作队列中的任务才可以真正执行。
- 队列和任务的清除操作
//取消任务
int cancel_delayed_work(struct work_struct *work);
//清空队列中的所有任务
void flush_workqueue(struct workqueue_struct *queue);
//销毁工作队列
void destroy_workqueue(struct workqueue_struct *queue);