启用中断但没有ISR


10

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

当发生这样的中断时,我知道相应的中断标志将被置位,但是由于我尚未定义任何ISR,因此不会为该中断的控制传递存储任何中断向量偏移地址,因此控制将回传到主例程,我可以通过在主例程中轮询中断标志来重置中断标志(这是我的想法)。当CPU确定没有ISR跳到该中断标志时,会有任何延迟吗?

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

谢谢。

更新:

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

B       .
ENDP

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


3
您无需启用中断就可以轮询您的主要功能中的标志。如果出现设置标志的条件,则无论您是否启用了相关的中断,该标志都会被设置。
brhans

乌尔说即使我不启用“总线仲裁丢失中断”(尽管除中断状态寄存器外,没有状态寄存器都可以指示总线仲裁丢失),总线仲裁丢失中断标志也会被置位吗?
AlphaGoku

是。在我使用过的每个MCU中,只要应该设置中断标志的条件发生,就会设置中断标志。启用该中断会使MCU在设置了相关标志时引导到处理程序,而禁用该中断将导致它忽略该标志,即使设置了该标志也不会引导到处理程序。禁用/启用中断只会影响跳转到中断处理程序的行为,而不会影响标志设置行为。
brhans

哇,那是我所不知道的。非常感谢。因此,即使尚未启用中断,每个驱动程序也必须定期检查中断状态寄存器并重置它们:)
AlphaGoku

@AkshayImmanuelD仅在重要时使用。如果中断始终被禁用,并且其他任何内容都不关心该标志,则设置还是清除该标志都不重要。
hobbs

Answers:


17

如果未定义ISR,则中断向量中跳转指令的位置将为null,可能是跳转到异常例程,可能是跳转到程序的开头,或者可能包含“返回中断”(例如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是不明智的做法。不要这样


2
....,也可以不确定。
Wouter van Ooijen

@WoutervanOoijen就是中断向量为空的意思。
tcrosley

1
状态寄存器不能指示一些错误,例如我上面提到的错误。但是,此类错误确实会产生中断。因此,我想启用中断只是为了识别错误,而不使用任何ISR。在使用Keil模拟LPC1778时,我没有遇到任何异常,因此我想uC必须使用您提到的RTI
AlphaGoku

1
有一点需要注意的-如果您启用了中断,但是您的处理程序没有清除该标志(或者没有处理程序,并且默认行为是简单的返回),那么您很可能会发现您的MCU永远永远存在卡在中断循环中。
brhans

1
可以对ATSAM3X8E上的PIO中断进行边沿触发,但是一旦您设置了中断处理程序中的ISR(中断状态寄存器),就不会清除曾经设置的中断条件-导致循环@brhans。
西蒙·赖特

1

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

根据我的经验:

  1. AVR-默认情况下,如果您未指定ISR,则Flash中的中断向量将为0x0000,这意味着只要此中断发生,您的应用程序就会跳入复位状态。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.