- //tasklet使用模板
- /*定义tasklet和底半部函数相关联*/
- void xxx_do_tasklet(unsigned long);
- DECLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0);
- /*中断处理底半部*/
- void xxx_do_tasklet(unsigned long)
- {
- ............
- }
- /*中断处理顶半部*/
- irqreturn_t xxx_interrupt(int irq,void *dev_id,struct pt_regs *regs)
- {
- .....................
- /*调度xxx_do_tasklet函数在适当的时候执行。*/
- tasklet_schedule(&xxx_tasklet);
- ......................
- }
- /*设备驱动模块加载函数*/
- int __init xxx_init(void)
- {
- .................
- /*申请中断*/
- result=request_irq(xxx_irq,xxx_interrupt,SA_INTERRUPT,"XX",NULL);
- ..................
- }
- /*设备驱动模块卸载函数*/
- void __exit xxx_exit(void)
- {
- .....................
- free_irq(xxx_irq,xxx_interrupt);
- .....................
- }
- //工作队列使用模板
- /*定义工作队列和关联函数*/
- struct work_struct xxx_wq;
- void xxx_do_work(unsigned long);
- /*中断处理底半部*/
- void xxx_do_work(unsigned long)
- {
- ....................
- }
- /*中断处理顶半部*/
- irqreturn_t xxx_interrupt(int irq,void *dev_id,struct pt_regs *regs)
- {
- ................
- schedule_work(&xxx_wq);
- ...................
- }
- /*设备驱动模块加载函数*/
- int xxx_init(void)
- {
- ................
- /*申请中断*/
- result=request_irq(xxx_irq,xxx_interrupt,SA_INTERRUPT,"xxx",NULL);
- .................
- /*初始化队列*/
- INIT_WORK(&xxx_wq,(void (*)(void *)) xxx_do_work,NULL);
- .................
- }
- /*设备驱动模块卸载函数*/
- void xxx_exit(void)
- {
- ...............
- /*释放中断*/
- free_irq(xxx_irq,xxx_interrupt);
- ................
- }
- /*软中断和tasklet仍然运行于中断上下文,而工作队列则运行于进程上下文。因此,软中断和tasklet处理函数中不能睡眠,而工作队列处理函数中允许睡眠。
- local_bh_disable()和local_bh_enbale()是内核中用于禁止和使能 中断和tasklet底半部机制的函数*/