什么是链式IRQ?什么是chained_irq_enter
and chained_irq_exit
这样做,因为在中断发生后,IRQ 线被禁用,但是chained_irq_enter
正在调用与屏蔽中断相关的函数。如果线路已经被禁用,为什么要屏蔽中断?
什么是链式中断?
有两种方法可以在父(中断控制器)设备的 IRQ 处理程序中调用子设备的中断处理程序。
-
连锁中断:
- “链接”意味着这些中断只是函数调用链(例如,SoC 的 GPIO 模块中断处理程序是从 GIC 中断处理程序调用的,就像函数调用一样)
-
generic_handle_irq()
用于中断链接
- 子 IRQ 处理程序在父硬件 IRQ 处理程序内部被调用
- 您不能调用可能在链接(子)中断处理程序中休眠的函数,因为它们仍在原子上下文(硬件中断)
- 这种方法通常用于 SoC 内部 GPIO 模块的驱动程序
-
嵌套中断
- “嵌套”意味着这些中断可以被另一个中断打断;但它们并不是真正的硬件 IRQ,而是线程 IRQ
-
handle_nested_irq()
用于创建嵌套中断
- 子 IRQ 处理程序在 new 内部被调用thread由...制作
handle_nested_irq()
功能;我们需要它们运行流程上下文,这样我们就可以调用休眠总线函数(比如可能休眠的 I2C 函数)
- 您可以调用可能在嵌套(子)中断处理程序中休眠的函数
- 这种方法通常用于外部芯片的驱动程序,例如 GPIO 扩展器,因为它们通常通过 I2C 总线连接到 SoC,并且 I2C 功能可能会休眠
说到上面讨论的驱动程序:
-
irq-gic
驱动程序使用CHAINED GPIO irqchips
处理具有多个 GIC 的系统的方法;this提交添加了该功能
-
gpio-omap
驱动程序(上面提到的)使用GENERIC CHAINED GPIO irqchips
方法。看this犯罪。它是从使用常规转换而来的CHAINED GPIO irqchips
这样在实时内核上它将是线程化的 IRQ 处理程序,但在非 RT 内核上它将是硬 IRQ 处理程序
- “gpio-max732x”驱动程序使用
NESTED THREADED GPIO irqchips
方法
什么是chained_irq_enter
and chained_irq_exit
do
这些函数实现了硬件中断流控制,即通知中断控制器芯片何时屏蔽和取消屏蔽当前中断。
-
For FastEOI中断控制器(最现代的方式):
-
chained_irq_enter()
没做什么
-
chained_irq_exit()
calls irq_eoi()
回调通知中断控制器中断处理完成
-
对于具有屏蔽/取消屏蔽/确认功能的中断控制器
-
chained_irq_enter()
屏蔽当前中断,如果也设置了 ack 回调则确认它
-
chained_irq_exit()
取消屏蔽中断
因为在中断发生后,irq线被禁用,但是chained_irq_enter
如果线路已经被禁用,那么调用与屏蔽中断相关的函数为什么要屏蔽中断?
IRQ 线被禁用。但我们仍然需要在中断处理结束时写入EOI寄存器。或者发送 ACK 以获取边沿级中断。
This解释了为什么在中断处理程序中禁用中断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)