如果中断下半部使用tasklet机制的话,实际上是利用软件中断来处理中断下半部。因此tasklet中不允许使用可能引起进行睡眠的函数调用。而work机制则是在一个独立的进程中来处理中断下半部,所以它允许调用可能引起进程睡眠的函数。
1.work的结构体
struct work_struct
{
atomic_long_t data;
struct list_head entry;
work_func_t func;
};
2.在驱动程序中声明work对象
struct work_struct my_work;
3.在模块入口函数中初始化work对象
// INIT_WORK原型
// #define INIT_WORK(_work, _func)
INIT_WORK( &my_work, my_irq_half ) ;
4.在中断处理函数中启动中断下半部
schedule_work(&my_work);