0

关于Linux的中断处理中断处理Linux和待处理中断

在我的司机基本的问题,我禁止外的中断线路,并做一些处理,在此期间,外围设备发送中断。当我启用中断线时,我收到了当时发生的挂起中断。

这是正确的理解?

如果是,我该如何丢弃在中断禁止期间产生的那些中断。

我可以实现一些使用某些延迟的工作,寻找linux API或干净的方式来做到这一点。

在启用中断之前,我们可以设置 desc = irq_to_desc(client-> irq); desc-> istate & =〜IRQS_PENDING; 并启用中断线,它将清除所有挂起的中断,但代码表示我们不应该修改这些变量。

谢谢

+0

上中断,我不认为忽略它是有史以来做合理的事情。您禁用线路,从设备读取事件并再次启用该线路。如果在线路禁用时中断到达,您可能已经看到触发该线路的事件,但很可能没有。所以你不应该忽略它。你必须再次检查是否有未处理的事件。 – 2014-10-09 10:04:20

+1

如果我们检查__enable_irq函数,它会调用check_irq_resend(desc,irq);这将重新发送任何挂起的中断。 – shunty 2014-10-09 10:22:47

+0

嗯,是的,因为如果IRQ在禁用时发生,它仍然需要处理。如果不是,你可能会错过导致它的事件。 – 2014-10-09 11:13:14

回答

1

可能是我不理解,但我认为你必须做的是:

  • 直接在设备上禁用interupt并没有使用内核中断处理例程

  • 调查你的设备,获取所有事件。可能是你应该在一个线程中断处理程序

  • 做到这一点,当完成重新启用该设备

+0

这将解决问题,但设备不暴露寄存器来控制中断。请分享您对以下解决方案的意见。在启用中断之前,我们可以设置desc = irq_to_desc(client-> irq); desc-> istate&=〜IRQS_PENDING;并启用中断线,它将清除所有待处理的中断。 – shunty 2014-10-09 23:49:34