工作队列
工作队列的实现和tasklet很相似,只是工作队列的执行上下文在内核线程,所以可以调度和睡眠。首先是定义一个工作队列和一个底半部执行函数
struct work_struct my_wq;
Voidmy_wq_func(struct work_struct *work)
通过INIT_WORK()宏,可以初始化工作队列并将工作队列和处理函数进行绑定
INIT_WORK(&my_wq, my_wq_func);
和tasklet_schedule函数相对应的是schedule_work()函数,调度工作队列
Schedule_work(&my_wq)
工作队列的处理模型也是tasklet一样一样的,只是在初始化工作队列和关联处理函数的时候将他放在了模块初始化函数里面
//定义函数并关联他们
struct work_struct my_wq;
Voidmy_wq_func(struct work_struct *work)
//中断处理函数
Void my_wq_func(unsignedlong){
}
//中断处理顶半部
Irqreturn_txxx_interrupt(intirq, void *dev_id){
Schedule_work(&my_wq)
}
//模块加载函数
Int __init xxx_init(){
INIT_WORK(&my_wq, my_wq_func);//初始化最好放在前面
//申请中断
request_irq()
}
//模块卸载函数
Void __exit xxx_exit(){
//释放中断
Free_irq()
}
实际上,在一些驱动中经常看到的是work_struct和workqueue_struct一起使用