1

我试图更好地理解在基于 GPIO 引脚的中断处理程序(上半部分)和 GPIO 引脚硬件中使用的“return IRQ_HANDLED”语句之间的交互。特别是,考虑设备已将 GPIO 引脚拉低以指示它需要注意的假设情况。这会导致调用相关的(上半部分)中断处理程序。现在假设上半部分处理程序排队了一些工作,然后返回“return IRQ_HANDLED”,但是无论出于何种原因,生成它的设备上的中断都没有被清除(即设备将 GPIO 引脚保持在低状态)。调用“return IRQ_HANDLED”是否会导致重新生成中断?我在以下文章的背景下问这个问题:

http://www.makelinux.net/books/lkd2/ch06lev1sec4

“可重入和中断处理程序 Linux 中的中断处理程序不需要是可重入的。当给定的中断处理程序正在执行时,相应的中断线在所有处理器上被屏蔽,防止接收到同一条线上的另一个中断。通常所有其他中断都被启用,所以其他中断被服务,但当前行总是被禁用。因此,同一个中断处理程序永远不会同时调用来服务嵌套中断。这大大简化了中断处理程序的编写。

上面的注释表明,在调用中断处理程序时,该中断的中断线被屏蔽。我试图弄清楚“return IRQ_HANDLED”的调用是否是取消屏蔽中断线的原因。并且,关于上述假设情况,如果我“返回 IRQ_HANDLED”但设备尚未真正清除其中断,因此仍将 GPIO 引脚保持在低(触发)状态,会发生什么情况。更具体地说,这是否会导致再次生成中断,从而使处理器永远没有机会完成第一次发生中断时排队的工作。即,这是否会导致中断风暴,其中处理器可能被无休止地中断,从而不允许任何有用的处理发生。

提前致谢,

吉姆

PS:我不清楚启用/禁用中断(特别是与特定 GPIO 引脚关联的中断)和屏蔽/取消屏蔽相同的 GPIO 中断之间的区别。

4

0 回答 0