如何在Linux中避免共享IRQ竞争

时间:2012-01-11 07:01:29

标签: linux embedded interrupt

我正在考虑嵌入式Linux项目中即将出现的情况(还没有硬件),其中两个外部芯片需要共享一条物理IRQ线。该线路能够用于边沿触发的硬件,但不能用于电平触发的中断。

看看Linux中的共享irq支持,我理解这对两个独立驱动程序的工作方式是每个驱动程序都会调用它们的中断处理程序,检查它们的硬件并在适当的时候处理。

然而,我想象下面的竞争条件,并想知道我是否遗漏了什么或者可以做些什么来解决这个问题。假设有两个外部中断源,设备A和B:

  1. 发生设备B中断,IRQ激活
  2. IRQ edge导致Linux核心中断处理程序运行
  3. 设备A的ISR运行,发现没有待处理的中断
  4. 设备发生中断,IRQ保持活动状态(线或)
  5. 设备B的ISR运行,发现中断挂起,处理并清除它
  6. 核心中断处理程序退出
  7. IRQ保持活动状态,不再生成边缘,IRQ被锁定
  8. 为了解决这个问题,核心中断处理程序必须在运行所有处理程序后检查IRQ级别,如果仍然处于活动状态,则再次运行它们。 Linux会这样做吗?我不认为中断内核知道如何检查IRQ线的电平。

    这场比赛是否真的会发生,如果是这样,我该怎么处理?

1 个答案:

答案 0 :(得分:2)

基本上,使用您所描述的硬件,执行有线或中断将永远无法正常工作。

如果你想做有线或者,你真的需要使用对级别敏感的IRQ输入。如果这不可行,那么也许你可以添加某种中断控制器。该设备将采用N个级别敏感的输入,并具有一个输出,并且某种“清除”。当中断控制器清零时,它会降低它的输出,然后如果输出中的任何一个仍然有效,则重新断言输出。

在软件方面,您可以看到正在将IRQ线路运行到另一个处理器输入。这将允许您至少检查状态,但Linux核心ISR处理不会对此有任何了解,因此您必须修补某些内容以使其检查并再次循环通过ISR。此外,这意味着在繁重的中断加载情况下,您永远不会离开此ISR。鉴于你正在进行线路或IRQ,我有点假设这些设备不会经常中断。

另一件事是要非常努力地看待处理器。您可以通过中断设置获取某种技巧,以使其再次识别中断。

我不会尝试任何过于棘手的事情,我要么将源分离到单独的IRQ输入,更改为电平敏感输入,或添加中断控制器芯片。