//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底半部机制的函数*/
linux顶半部和底半部中断机制
最新推荐文章于 2025-02-24 14:17:01 发布