Linux内核中将中断响应的处理可以分为两部分:顶半部和底半部
1,顶半部处理要紧且操作时间短的事件,如恢复相应的寄存器状态
2,底半部处理操作时间长的事件
实现以上机制的两种:
1,tasklet
使用模板如下:
/*声明底半部函数*/
void xxx_do_tasklet(unsigned long);
/*
此宏实际就是创建一个struct tasklet_struct xxx_tasklet结构体
并关联对于的底半部处理函数
*/
DECLARE_TASKLET(xxx_tasklet, xxx_do_tasklet, 0);
/*底半部处理函数*/
void xxx_do_tasklet(unsigned long)
{
...
}
/*在中断处理函数中调度tasklet*/
irqreturn_t xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
...
tasklet_schedule(&xxx_tasklet);
...
}
2,工作队列
使用模板如下:
/*定义一个工作队列*/
struct work_struct my_wq;
/*定义一个处理函数*/
void my_wq_func(unsigned long);
/*初始化工作队列并将其与处理函数绑定*/
INIT_WORK(&my_wq, (void (*)(void *)) my_wq_func, NULL);
/*调度工作队列执行*/
schedule_work(&my_wq);