linux顶半部和底半部中断机制

//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底半部机制的函数*/


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值