当我们使用irq_set_chained_handler时,当我们为相关的处理程序提供服务时,irq行不会被禁用或不被禁用,就像在request_irq的情况下一样。
发布于 2015-12-23 07:15:40
中断是如何设置的并不重要。当发生任何中断时,所有中断(针对此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内核的现代版本中,所有中断都被认为是“快速”的,并且在运行时都禁用了中断。具有大量处理程序的中断必须以线程的形式实现(或者使用local_irq_enable_in_hardirq()在ISR中手动启用中断)。
在Linux v2.6.35中,this提交改变了这种行为。您可以找到有关此here的更多详细信息。
发布于 2015-12-22 12:43:14
参考https://www.kernel.org/doc/Documentation/gpio/driver.txt
这意味着使用irq_set_chained_handler()或相应的gpiochip_set_chained_irqchip()帮助器函数注册GPIO,并且GPIO处理程序将立即从父irqchip调用,同时保持IRQs禁用。然后,GPIO irqchip将在其中断处理程序中调用类似以下序列的内容:
https://stackoverflow.com/questions/34391340
复制相似问题