中断
中断分 向量中断 和 非向量中断
- 向量中断由硬件提供中断服务程序入口地址
- 非向量中断由软件提供中断服务程序入口地址
程序架构
- top half: 紧急的硬件操作(调度 bottom half),不可中断
- bottom half: 延缓的耗时操作,可响应新的中断
request & free
flags若设置 IRQF_SHARED ,则表示多个设备共享中断
使能和屏蔽中断
disable_irq_nosync() 与 disable_irq() 的区别在于前者立即返回,而后者等待目前的中断处理完成。由于 disable_irq() 会等待指定的中断号被处理完,因此如果在n号中断顶半部调用 disable_irq(n) ,会引起系统死锁
底半部
- tasklet
- 工作队列
- 软中断
- 线程化irq
tasklet
执行上下文是软中断
void xxx_do_tasklet(unsigned long);
DECLEAR_TASKLET(xxx_tasklet, xxx_do_tasklet, NULL);
void xxx_do_tasklet(unsigned long)
{
...
}
irqreturn_t xxx_interrupt(int irq, void *dev_id)
{
...
tasklet_schedule(&xxx_tasklet);
...
}
int __init xxx_init(void)
{
...
result