【问题标题】:Questions about interrupts during an ISR关于 ISR 期间中断的问题
【发布时间】:2020-09-22 16:36:50
【问题描述】:

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

这个问题是在一次远足时遇到的,后来我找不到我想要的东西。

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

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

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

感谢所有答案。通常,我的 ISR 足够短,以至于这还没有发生。

谢谢!

【问题讨论】:

    标签: embedded hardware interrupt


    【解决方案1】:

    由于您没有具体了解特定处理器或中断控制器,因此以下通常是正确的。对于特定的实现,您必须查阅特定硬件的参考资料。

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

    此外,如果在中断标志被清除之后但在 ISR 完成之前在 ISR 内发生事件会发生什么?

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

    如果您的 ISR 未在另一事件发生之前完成,那么您有以下一项或多项:

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

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

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

    【讨论】:

    • 一般来说,运行 ISR 时出现中断并不是一件坏事。您可以有多个中断源,这就是为什么特别为微控制器指定多种优先级的原因。你“只是”需要确切地知道你在做什么。 (但这实际上适用于您开发的任何东西。)
    • @thebusybee 虽然你是对的,但问题是关于与当前正在服务的中断发生的 same 中断有关,而不是关于中断优先级嵌套。如果不是从标题中,从正文中可以清楚地看到。
    • 你可以从文字中得出结论,对。但是,至少有一次我有一个应用程序需要在其 ISR 仍在运行时处理相同的中断触发。这是因为每次运行 ISR 的周期数不同,有时在两个事件之间占用的周期数超过可用周期数,但总能赶上。因此,它经过精心设计,并被证明可以在所有情况下工作。
    • @thebusybee 我的回答中涵盖了这种情况,在未决标志不是计数对象的解释中。如果您有您认为相关的特定经验,请发布您自己的答案。我无法谈论你的经历。
    • 无意冒犯,我只是想缓和看似“硬”的不这样做的理由列表。 ;-) 一切顺利!
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多