问题描述
这是第一次张贴,请告诉我是否应张贴在其他地方。请客气:p。
这个问题是我徒步旅行时遇到的,我找不到确切的答案。
假设我有一个事件的ISR。通常,该事件将触发中断,ISR将运行,然后我们将继续以快乐的方式进行。
假设现在我有一些共享变量,并且作为一个非常简单的解决方法,我在关键部分全局禁用了中断。如果该事件发生在此关键部分期间,ISR是在我重新启用中断后执行还是该事件从未处理过?
此外,如果中断标志已清除但ISR完成之前,如果ISR内部发生事件,会发生什么情况?如果它多次发生,那么只有ISR中发生的第一个事件会得到处理吗?
欣赏所有答案。通常,我会将ISR保留得足够短,以至于还没有发生。
谢谢!
解决方法
由于您不确定特定的处理器或中断控制器,因此以下内容通常是正确的。对于特定的实现,您必须参考特定硬件的参考资料。
当在禁用中断的情况下发生中断时,将设置“中断暂挂”标志,如果事先未明确清除该标志,则将在重新启用中断后立即调用该中断。
此外,如果在清除中断标志之后但在ISR完成之前,如果要在ISR内部发生事件,会发生什么?
假定中断控制器自动禁用活动中断,则该中断将再次变为挂起状态,并且一旦完成,ISR将被调用。挂起标志不是计数对象,因此,如果在设置挂起标志后发生多个事件,则不会导致ISR针对每个事件运行。
如果您的ISR在另一事件发生之前尚未完成,则您可能具有以下一项或多项:
- ISR执行时间过长
- 该应用的处理器太慢了
- 对处理器性能的期望过高,
- 糟糕的设计。
ISR应该既简短又确定性(即,它应该具有恒定的执行时间,或者至少具有有限的执行时间)。通常,应该使用信号发送一些约束较少的过程来执行较慢和确定性较低的处理,使用缓冲或事件计数(例如,在RTOS中使用消息队列或计数信号量)来解决确定性方面的不匹配。
在信号处理中,ADC可能具有很高的采样率,并且每个采样产生一个中断,您可能会在其中获得处理器无法应付的中断率。在这种情况下,使用ADC中断可能不切实际-采样率要高于1KHz,但取决于处理器性能以及在可用CPU周期内必须完成哪些其他工作。在那种情况下,一种解决方案是使用DMA传输,其中在样品完成时向DMA控制器发送信号,并将样品直接传输到内存。可以配置为对多个样本执行此操作,然后为整个样本块生成单个中断。与一次在中断中一次处理一个样本相比,一次性处理一块样本的开销通常要低得多。