1

在ISR处理程序的上半部分可以做或需要做的事情是什么。我看到中断首先被禁用,所以当这完成后,我们不会错过在处理当前中断时可能到达的其他中断(在同一 IRQ 线上)吗?

或者是否有任何“实体”跟踪丢失的中断,以便在当前运行的 ISR 结束时为该行再次启用中断后处理它们?

4

3 回答 3

3

关于共享中断的简短说明:共享中断线应始终使用对电平敏感的设备,这些设备也应该是相同的电平(高电平与低电平)。对于边沿触发的中断,无法保证在一个设备触发之后,但在它返回其稳定状态之前,另一个设备不会触发。它成为一种无法避免的竞争条件。

另一方面,电平触发的中断保持活动状态,直到设备上触发它的标志被清除。在处理第一个设备时,如果第二个设备触发,那么它将等待 IRQ 线保持活动状态,直到处理程序再次启用 IRQ 线。

于 2013-03-13T07:27:38.150 回答
2

您应该正确地确认中断以避免 IRQ 风暴。处理中断本身 - 如果您有大量工作要做,请卸载到下半部分。

禁用中断时会发生什么:在 x86 上,该cli指令禁用当前运行 ISR 的CPU上的中断。一个 IRQ 被缓冲,因此当使用 恢复中断时sti,它会被传递。

当使用 APIC 中断时,缓冲发生在内核本身。enable_irq内核确认 APIC 中断并在被调用时再次触发它。

于 2013-03-12T17:03:45.927 回答
2

中断处理程序应尽可能少。

并不总是需要禁用中断。一些架构使用嵌套中断。无论如何,如果您禁用中断,您应该为一两个命令执行此操作,而不是更多。这将造成延迟并可能错过中断。

当我处理中断时,我通常会做两件事。一是清除引起中断的标志。二是事后触发一些功能(tasklet、workqueue等)

请注意不要在可能休眠的中断处理程序中使用任何方法,例如 printf 或获取mutex

于 2013-03-12T13:09:55.680 回答