如果我的中断处理程序禁用中断或不ARM处理器会自动做呢?(Should my interrupt h

2019-08-06 13:49发布

我们的组使用定制的驱动程序相接口4克MAX3107的UART一个共享的I2C总线上。 四个MAX3107的的中断连接(通过逻辑或所得即共享的中断))到ARM9处理器(LPC3180模块)上的GPIO引脚。 当一个或多个这些设备的中断,它们拉GPIO线,其被配置为电平敏感中断,低。 我的问题是关于需要,还是不行,禁止在处理程序代码的具体断线。 (我要补充一点,我们运行的是Linux 2.6.10)。

根据我对中断几个特定ARM的应用笔记阅读,似乎当ARM处理器接收到中断时,它会自动禁用(口罩?)相应的中断线路(在我们的情况下,这似乎是对应于行GPIO引脚我们选择)。 如果这是真的,那么我们似乎不应该在我们的中断处理程序代码的GPIO引脚禁止中断,因为这样做会显得多余(虽然它似乎工作没关系)。 换句话说,在我看来,如果ARM处理器会自动禁用GPIO中断时产生中断发生,那么如果有的话,我们的中断处理程序代码应该只需要重新启用中断一旦设备被服务。

我们使用的是中断处理程序代码包括disable_irq_nosync(irqno); 在处理程序和相应的最开始enable_irq()在处理程序结束。 如果ARM处理器已经禁用了中断线路(硬件),什么是这些调用(即调用效果disable_irq_nosync()然后调用enable(irq())

Answer 1:

从ARM信息中心文档:

在进入异常(中断):

  • 中断请求(IRQ)是所有异常禁用

  • 快速中断请求(使得FIQ)是FIQ禁用和复位异常。

它接着说:

处理FIQ会导致的IRQ和随后使得FIQ被禁用,防止它们直到FIQ处理程序使后它们被处理。 这通常是通过在处理程序结束时从SPSR恢复CPSR来完成的。

所以你不必担心禁用它们,但你不必担心重新启用它们。

您将需要包括enable_irq()在你的程序结束,但你不应该需要在一开始就禁止任何东西。 我不认为调用软件disable_irq_nosync(irqno)后,它被称为硬件将影响任何东西。 由于硬件调用软件调用之前最绝对称得上有机会接管。 但是,它可能会更好,从代码中删除它遵循惯例,而不是混淆的下一个程序员谁需要看看它。

这里更多的信息:

手臂信息中心



文章来源: Should my interrupt handler disable interrupts or does the ARM processor do it automatically?