3

我们小组正在使用自定义驱动程序来连接共享 I2C 总线上的四个 MAX3107 UART。四个 MAX3107 的中断连接到 ARM9 处理器(LPC3180 模块)上的一个 GPIO 引脚(即通过逻辑或运算共享中断)。当这些设备中的一个或多个中断时,它们会将配置为电平敏感中断的 GPIO 线拉低。我的问题涉及是否需要禁用处理程序代码中的特定中断线。(我应该补充一点,我们正在运行 Linux 2.6.10)。

根据我对中断的几个 ARM 特定应用说明的阅读,似乎当 ARM 处理器接收到中断时,它会自动禁用(屏蔽?)相应的中断线(在我们的例子中,这似乎是对应于我们选择的 GPIO 引脚)。如果这是真的,那么我们似乎不必在我们的中断处理程序代码中禁用此 GPIO 引脚的中断,因为这样做似乎是多余的(尽管它似乎工作正常)。换句话说,在我看来,如果 ARM 处理器在发生中断时自动禁用 GPIO 中断,那么如果有的话,我们的中断处理程序代码应该只需要在设备得到服务后重新启用中断。

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

4

1 回答 1

6

来自 Arm 信息中心文档:

进入异常(中断)时:

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

  • 对于 FIQ 和复位异常,禁用快速中断请求 (FIQ)。

然后它继续说:

处理 FIQ 会导致 IRQ 和随后的 FIQ 被禁用,从而在 FIQ 处理程序启用它们之前阻止它们被处理。这通常通过在处理程序结束时从 SPSR 恢复 CPSR 来完成。

因此,您不必担心禁用它们,但您必须担心重新启用它们。

您需要在例程结束时包含 enable_irq(),但您不需要在开始时禁用任何内容。我认为在硬件中调用 disable_irq_nosync(irqno) 之后在软件中调用它不会影响任何事情。因为硬件调用肯定是在软件调用有机会接管之前调用的。但是最好将其从代码中删除以遵循约定,而不是让下一个查看它的程序员感到困惑。

更多信息在这里:

手臂信息中心

于 2013-01-12T17:08:31.693 回答