首页 文章

我的中断处理程序是应该禁用中断还是ARM处理器自动执行?

提问于
浏览
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处理器已经禁用了中断线(在硬件中),这些调用会产生什么影响(即调用 disable_irq_nosync() 后调用 enable(irq())

1 回答

  • 6

    从Arm信息中心文档:

    进入异常(中断)时:对所有异常禁用中断请求(IRQ)对FIQ和复位异常禁用快速中断请求(FIQ) .

    然后继续说:

    处理FIQ会导致IRQ和后续FIQ被禁用,直到FIQ处理程序启用它们之后才能处理它们 . 这通常通过在处理程序末尾从SPSR恢复CPSR来完成 .

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

    您需要在例程结束时包含enable_irq(),但您不需要在开头禁用任何内容 . 我不认为在硬件中调用后调用disable_irq_nosync(irqno)会影响任何事情 . 由于在软件调用有机会接管之前,最明确地调用硬件调用 . 但是从代码中删除它以遵循惯例可能更好,而不是混淆下一个看过它的程序员 .

    更多信息:

    Arm Information Center

相关问题