中断分层主要是为了解决驱动某些情况下中断处理中如果有其他中断产生会将其忽略的问题,将中断处理程序中与硬件无关的软件处理部分提交到工作队列,由CPU在适当的时候进行处理。
一:中断嵌套
1、软终端
2、tasklet
3、工作队列(使用最多的方式)
linux内核使用struct work_struct来描述一个工作队列
struct workqueue_struct
{
struct cpu_workqueue_sturct *cpu_wq;
stuct list_head list;
const char *name; 工作队列名字
int singlethread;
int freezeable; freeze threads during suspend
int rt;
};
linux内核使用struct work_struct来描述一个工作项
struct work_struct
{
atomic_long_t data;
struct list_head entry;
work_func_t func;
};
typedef void(*work_func_t)(struct work_struct *work);
二:中断分层方式
三:使用工作队列实现中段分层
1、创建工作队列
create_workqueue
2、创建工作
INIT_WORK
3、提交工作
queue_work
大多数情况下驱动并不需要自己创建工作队列,只需要定义工作,然后将工作提交到内核已经定义好的工作队列keventd_wq中。
1、提交工作到默认队列
schedule_work