启用中断但没有 ISR

电器工程 微控制器 中断 能够
2022-01-08 02:43:15

我想知道如果启用中断会发生什么(例如:NXP LPC1778 的 CAN 模块中的仲裁丢失中断),但没有为中断定义 ISR。

当这样的中断发生时,我知道相应的中断标志将被设置,但由于我没有定义任何 ISR,因此不会存储任何中断向量偏移地址用于此类中断的控制传输,因此控制将返回到主程序,我可以通过在主程序中轮询它来重置中断标志(这就是我的想法)。当 CPU 发现没有 ISR 可以跳转时会有任何延迟吗?

关于可能发生的事情的任何解决方案都可以真正帮助我。

谢谢。

更新:

我在我的 uC 上启用了 CAN 中断,但没有定义 ISR。当我执行内部环回测试时,代码进入了无限循环。这是在 LPC1778 上执行的无限循环的反汇编代码:

B       .
ENDP

所以,如果您使用中断,请使用 ISR。

2个回答

如果没有定义 ISR,跳转指令在中断向量中的位置要么为空,要么跳转到异常程序,要么跳转到程序开头,要么包含“return from中断”(例如 RTI)指令。

这是 ATMega 16 处理器的中断表的反汇编,显示三个未使用的中断向量化到处理这种情况的例程(它可能只是进入无限循环)和一个合法向量。

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

前面描述的处理丢失 ISR 的方法中的哪一种将取决于微控制器的架构和编译器。在 RTI 或等效指令的情况下,它将立即返回到应用程序。但是,如果中断是电平触发而不是边沿触发,那么这可能会导致中断再次被触发,因此您最终会陷入无限循环。

我认为内部中断(例如UART接收的字符)被认为是电平触发还是边缘触发可能取决于芯片的架构。外部中断通常可以配置为一个或另一个。

还有另一种情况,有时将几个中断组合在一起并使用相同的向量。对于可能只有几个中断的旧处理器来说尤其如此。在那种情况下,中断原因是通过轮询中断寄存器的状态来确定的,这有点像你建议的。

但是在任何情况下,在系统中有中断并且没有定义 ISR 都是不好的做法。不要这样做。

这取决于您的 MCU、编译器和其余代码。

根据我的经验:

  1. AVR - 默认情况下,如果您未指定 ISR,则闪存中的中断向量将为 0x0000,这意味着您的应用程序将在此中断发生时跳转到复位。

    如果您确实需要中断,但不需要处理程序(例如,使用 ADC 低噪声掉电模式并仅使用中断来唤醒 MCU),您应该使用EMPTY_INTERRUPT

  2. NXP Kinetis (ARM) - 默认情况下,所有向量都指向具有断点的默认处理程序,CPU 将简单地停止并将其告知调试器。