在ISR处理程序的上半部分可以做或需要做的事情是什么。我看到中断首先被禁用,所以当这完成后,我们不会错过在处理当前中断时可能到达的其他中断(在同一 IRQ 线上)吗?
或者是否有任何“实体”跟踪丢失的中断,以便在当前运行的 ISR 结束时为该行再次启用中断后处理它们?
在ISR处理程序的上半部分可以做或需要做的事情是什么。我看到中断首先被禁用,所以当这完成后,我们不会错过在处理当前中断时可能到达的其他中断(在同一 IRQ 线上)吗?
或者是否有任何“实体”跟踪丢失的中断,以便在当前运行的 ISR 结束时为该行再次启用中断后处理它们?
关于共享中断的简短说明:共享中断线应始终使用对电平敏感的设备,这些设备也应该是相同的电平(高电平与低电平)。对于边沿触发的中断,无法保证在一个设备触发之后,但在它返回其稳定状态之前,另一个设备不会触发。它成为一种无法避免的竞争条件。
另一方面,电平触发的中断保持活动状态,直到设备上触发它的标志被清除。在处理第一个设备时,如果第二个设备触发,那么它将等待 IRQ 线保持活动状态,直到处理程序再次启用 IRQ 线。
您应该正确地确认中断以避免 IRQ 风暴。处理中断本身 - 如果您有大量工作要做,请卸载到下半部分。
禁用中断时会发生什么:在 x86 上,该cli
指令禁用当前运行 ISR 的CPU上的中断。一个 IRQ 被缓冲,因此当使用 恢复中断时sti
,它会被传递。
当使用 APIC 中断时,缓冲发生在内核本身。enable_irq
内核确认 APIC 中断并在被调用时再次触发它。
中断处理程序应尽可能少。
并不总是需要禁用中断。一些架构使用嵌套中断。无论如何,如果您禁用中断,您应该为一两个命令执行此操作,而不是更多。这将造成延迟并可能错过中断。
当我处理中断时,我通常会做两件事。一是清除引起中断的标志。二是事后触发一些功能(tasklet、workqueue等)
请注意不要在可能休眠的中断处理程序中使用任何方法,例如 printf 或获取mutex。