【发布时间】:2015-12-21 08:11:46
【问题描述】:
当我们使用 irq_set_chained_handler 时,当我们为相关的处理程序提供服务时,irq 行将不会被禁用,例如 request_irq。
【问题讨论】:
-
这是this问题的延续。
标签: linux-kernel linux-device-driver embedded-linux interrupt-handling irq
当我们使用 irq_set_chained_handler 时,当我们为相关的处理程序提供服务时,irq 行将不会被禁用,例如 request_irq。
【问题讨论】:
标签: linux-kernel linux-device-driver embedded-linux interrupt-handling irq
如何设置中断并不重要。当任何中断发生时,所有中断(对于这个 CPU)都将在中断处理程序期间被禁用。例如,在 ARM 体系结构中,在 C 代码中找到中断处理的第一个位置是 asm_do_IRQ() 函数(在 arch/arm/kernel/irq.c 中定义)。它是从汇编代码中调用的。对于任何中断(无论是request_irq() 还是irq_set_chained_handler() 请求的),都会调用相同的asm_do_IRQ() 函数,并且ARM CPU 会自动禁用中断。详情请见this answer。
另外,值得一提的是,不久前 Linux 内核提供了两种类型的中断:“快”和“慢”中断。快速中断(当使用IRQF_DISABLED 或SA_INTERRUPT 标志时)在禁用中断的情况下运行,并且这些处理程序应该非常短且快速。另一方面,慢速中断在重新启用中断的情况下运行,因为慢速中断的处理程序可能需要很多时间来处理。
在现代版本的 Linux 内核上,所有中断都被认为是“快速”的,并且在禁用中断的情况下运行。具有大量处理程序的中断必须以线程方式实现(或在 ISR 中使用 local_irq_enable_in_hardirq() 手动启用中断)。
【讨论】:
参考https://www.kernel.org/doc/Documentation/gpio/driver.txt
这意味着 GPIO irqchip 注册使用 irq_set_chained_handler() 或相应的 gpiochip_set_chained_irqchip() 辅助函数和 GPIO irqchip 处理程序将立即从父 irqchip 调用,而 禁用 IRQ。然后 GPIO irqchip 将最终调用 在其中断处理程序中类似于以下序列:
【讨论】: