【问题标题】:How shared IRQ races are avoided in Linux如何在 Linux 中避免共享 IRQ 竞争
【发布时间】:2012-02-07 13:54:16
【问题描述】:

我正在考虑嵌入式 Linux 项目(尚无硬件)中即将出现的情况,其中两个外部芯片需要共享一条物理 IRQ 线。这条线在硬件上可以边沿触发,但不能在电平触发中断。

查看 Linux 中的共享 irq 支持,我知道这与两个单独的驱动程序一起工作的方式是,每个驱动程序都会调用它们的中断处理程序,检查它们的硬件并在适当的情况下进行处理。

但是,我想像以下比赛条件,并想知道我是否遗漏了什么或可以采取什么措施来解决这个问题。假设有两个外部中断源,设备 A 和 B:

  1. 发生设备 B 中断,IRQ 变为活动状态
  2. IRQ 边缘导致 Linux 内核中断处理程序运行
  3. 设备 A 的 ISR 运行,发现没有挂起的中断
  4. 设备发生中断,IRQ 保持活动状态(线或)
  5. 设备 B 的 ISR 运行,找到挂起的中断,处理并清除它
  6. 核心中断处理程序退出
  7. IRQ 保持活动状态,不再生成边缘,IRQ 被锁定

似乎要解决这个问题,核心中断处理程序必须在运行所有处理程序后检查 IRQ 级别,如果仍然处于活动状态,则再次运行它们。 Linux会这样做吗?我认为中断核心不知道如何检查 IRQ 线的电平。

这场比赛真的会发生吗?如果是,我该如何处理?

【问题讨论】:

    标签: linux embedded interrupt


    【解决方案1】:

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

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

    在软件方面,您可以查看将 IRQ 线运行到另一个处理器输入。这将允许您至少检查状态,但 Linux 核心 ISR 处理对此一无所知,因此您必须修补一些东西以使其检查它并再次循环通过 ISR。此外,这意味着在繁重的中断加载情况下,您永远无法摆脱此 ISR。鉴于您在 IRQ 上进行连线或操作,我有点假设这些设备不会经常中断。

    另一件事是认真查看处理器。您可以通过中断设置来使用某种技巧,以使其再次识别中断。

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

    【讨论】:

    • 感谢您的建议。我认为我们将在 FPGA 中实现一个中断控制器,无论如何我们都需要在板上安装。
    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多