Linux 中断 -- 片段记录
系统中断线是有限的。能由硬件直接触发的中断数量有限。但系统有级连分发机制。即可以在一个中断
handler中去分发以它为父IRQ的子IRQ。要支持一些IRQ,需要下面几个步骤:
1
定义一个struct irq_chip,主要实现下面一些Callbacks:
void (*ack)(unsigned int irq);
void (*mask)(unsigned int irq);
void (*mask_ack)(unsigned int irq);
void (*unmask)(unsigned int irq);
2 注册IRQ相关信息
set_irq_chip(i, &at91_aic_chip);
set_irq_handler(i, handle_level_irq);
set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
3 request_irq()
绑定IRQ到某个IRQ handler。
4 分发处理
generic_handle_irq()直接触发中断
5 最后就转到Irq handler中。
中断上下文是不能sleep的。
6 要中断线程化,用request_threaded_irq()
中断传递过程:
硬件触发 --> CPU --> 中断向量表 --> 中断跳转表 --> 中断描述符表 --> 中断处理函数
参考:
http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/