【问题标题】:When we use irq_set_chained_handler the irq line will be disabled or not?当我们使用 irq_set_chained_handler 时,irq 行是否会被禁用?
【发布时间】:2015-12-21 08:11:46
【问题描述】:

当我们使用 irq_set_chained_handler 时,当我们为相关的处理程序提供服务时,irq 行将不会被禁用,例如 request_irq。

【问题讨论】:

  • 这是this问题的延续。

标签: linux-kernel linux-device-driver embedded-linux interrupt-handling irq


【解决方案1】:

如何设置中断并不重要。当任何中断发生时,所有中断(对于这个 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_DISABLEDSA_INTERRUPT 标志时)在禁用中断的情况下运行,并且这些处理程序应该非常短且快速。另一方面,慢速中断在重新启用中断的情况下运行,因为慢速中断的处理程序可能需要很多时间来处理。

在现代版本的 Linux 内核上,所有中断都被认为是“快速”的,并且在禁用中断的情况下运行。具有大量处理程序的中断必须以线程方式实现(或在 ISR 中使用 local_irq_enable_in_hardirq() 手动启用中断)。

this 提交在 Linux 内核 v2.6.35 中更改了该行为。您可以找到有关此here 的更多详细信息。

【讨论】:

    【解决方案2】:

    参考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 将最终调用 在其中断处理程序中类似于以下序列:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多