关于 ISR 期间中断的问题

Questions about interrupts during an ISR

第一次张贴在这里,让我知道是否应该张贴在其他地方。请善待 :p.

这个问题是我在徒步旅行时想到的,后来我找不到我要找的东西。

假设我有一个事件的 ISR。通常情况下,事件会触发中断,ISR 会 运行,然后我们将继续我们的快乐方式。

假设现在我有一些共享变量,作为一个超级简单的修复,我在临界区全局禁用中断。如果事件发生在此临界区,ISR 是在我重新启用中断后执行还是该事件从未被处理?

此外,如果在 ISR 内部发生事件,在清除中断标志之后但在 ISR 完成之前,会发生什么情况?如果它发生多次,是否只处理 ISR 中发生的第一个?

感谢所有回答。通常我会保持 ISR 足够短,这样还没有发生这种情况。

谢谢!

由于您没有具体说明特定处理器或中断控制器,因此以下内容通常 正确。对于特定的实现,您必须参考特定硬件的参考 material。

在中断被禁用的情况下发生中断时,将设置“中断挂起”标志,如果该标志未事先明确清除,中断将在重新启用中断后立即调用。

Furthermore, what would happen if an event was to occur inside the ISR, after the interrupt flag has been cleared but before the ISR finishes?

假设中断控制器自动禁用活动中断,中断将再次变为挂起状态,ISR 将在完成后立即be-invoked。挂起标志不是计数对象,因此如果在设置挂起标志后发生多个事件,则不会导致 ISR 为每个事件 运行。

如果您的 ISR 没有在可能发生另一事件之前完成,那么您可能有以下一种或多种情况:

  1. ISR 执行时间过长,
  2. 应用程序的处理器太慢,
  3. 对处理器性能的期望过高,
  4. 糟糕的设计。

ISR 应该既短又确定(即它应该有常数,或者至少有界的执行时间)。通常,它应该用于指示一些约束较少的进程来执行较慢且不确定性较低的处理,使用缓冲或事件计数(例如 RTOS 中的消息队列或计数信号量)来应对确定性的不匹配。

您可能会遇到处理器无法处理的中断率的一个示例是在信号处理中,其中 ADC 可能具有非常高的采样率并且每个样本生成一个中断。在这种情况下,使用 ADC 中断可能不切实际 - 任何高于 1KHz 的采样率,但取决于处​​理器性能以及在可用 CPU 周期内必须完成的其他工作。在这种情况下,一种解决方案是使用 DMA 传输,其中 DMA 控制器在样本完成时收到信号并将样本直接传输到内存。它可以配置为在为整个样本块生成单个中断之前对多个样本执行此操作。与在中断中一次处理一个样本相比,一次处理一个样本块的开销通常要低得多。