【发布时间】:2015-12-20 04:02:58
【问题描述】:
什么是链式 IRQ? chained_irq_enter 和 chained_irq_exit 做了什么,因为在出现中断后,IRQ 线被禁用,但 chained_irq_enter 正在调用与屏蔽中断相关的函数。如果线路已经被禁用,为什么要屏蔽中断?
【问题讨论】:
标签: linux linux-kernel embedded-linux interrupt-handling irq
什么是链式 IRQ? chained_irq_enter 和 chained_irq_exit 做了什么,因为在出现中断后,IRQ 线被禁用,但 chained_irq_enter 正在调用与屏蔽中断相关的函数。如果线路已经被禁用,为什么要屏蔽中断?
【问题讨论】:
标签: linux linux-kernel embedded-linux interrupt-handling irq
什么是链式中断?
在父(中断控制器)设备的 IRQ 处理程序中,有两种方法可以为子设备调用中断处理程序。
链式中断:
generic_handle_irq() 用于中断链接嵌套中断
handle_nested_irq() 用于创建嵌套中断handle_nested_irq() 函数创建的新 线程 内被调用;我们需要它们在进程上下文中运行,以便我们可以调用休眠总线函数(例如可能休眠的 I2C 函数)谈到上面讨论的驱动程序:
irq-gic 驱动程序使用CHAINED GPIO irqchips 方法来处理具有多个 GIC 的系统; thiscommit 添加了该功能gpio-omap 驱动程序(如上所述)使用GENERIC CHAINED GPIO irqchips 方法。请参阅this 提交。它是从使用常规的CHAINED GPIO irqchips 转换而来的,因此在实时内核上它将是线程 IRQ 处理程序,但在非 RT 内核上它将是硬 IRQ 处理程序NESTED THREADED GPIO irqchips方法
chained_irq_enter和chained_irq_exit做了什么
这些函数实现硬件中断流控制,即通知中断控制器芯片何时屏蔽和取消屏蔽当前中断。
对于FastEOI 中断控制器(最现代的方式):
chained_irq_enter()什么都不做chained_irq_exit()调用irq_eoi()回调告诉中断控制器中断处理完成对于具有屏蔽/取消屏蔽/确认功能的中断控制器
chained_irq_enter() 屏蔽当前中断,并在设置了 ack 回调时确认它chained_irq_exit() 取消屏蔽中断因为在产生中断后,irq 线被禁用,但
chained_irq_enter正在调用与屏蔽中断相关的函数,如果该线已被禁用,为什么要屏蔽中断?
IRQ 线路被禁用。但是我们仍然需要在中断处理结束时写入 EOI 寄存器。或者为边缘级中断发送 ACK。
This 解释了为什么在中断处理程序中禁用中断。
【讨论】:
阅读 Linux 内核文档以了解这些 API:
https://www.kernel.org/doc/Documentation/gpio/driver.txt
CHAINED GPIO irqchips:这些通常是嵌入在 一个 SoC。这意味着有一个用于 GPIO 的快速 IRQ 处理程序 从父 IRQ 处理程序链中调用,最典型的是 系统中断控制器。这意味着 GPIO irqchip 已注册 使用 irq_set_chained_handler() 或相应的 gpiochip_set_chained_irqchip() 辅助函数和 GPIO irqchip 处理程序将立即从父 irqchip 调用,而 禁用 IRQ。然后 GPIO irqchip 将最终调用 在其中断处理程序中类似于以下序列:
static irqreturn_t tc3589x_gpio_irq(int irq, void *data) chained_irq_enter(...); generic_handle_irq(...); chained_irq_exit(...);
【讨论】: