我们小组正在使用自定义驱动程序在共享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处理器已经禁用了中断线(在硬件中),这些调用会产生什么影响(即调用 disable_irq_nosync()
后调用 enable(irq())
?
1 回答
从Arm信息中心文档:
然后继续说:
因此,您不必担心禁用它们,但您必须担心重新启用它们 .
您需要在例程结束时包含enable_irq(),但您不需要在开头禁用任何内容 . 我不认为在硬件中调用后调用disable_irq_nosync(irqno)会影响任何事情 . 由于在软件调用有机会接管之前,最明确地调用硬件调用 . 但是从代码中删除它以遵循惯例可能更好,而不是混淆下一个看过它的程序员 .
更多信息:
Arm Information Center