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

标签 linux embedded interrupt

我正在考虑嵌入式 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 线的电平。

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

最佳答案

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

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

在软件方面,您可以查看将 IRQ 线运行到另一个处理器输入。这将允许您至少检查状态,但 Linux 核心 ISR 处理不会对此一无所知,因此您必须修补一些东西才能让它检查它并再次循环通过 ISR。此外,这意味着在中断负载很重的情况下,您永远不会退出此 ISR。鉴于您正在处理 IRQ 或 IRQ,我假设这些设备不会经常中断。

另一件事是仔细观察处理器。您可以通过中断设置使用某种技巧,使其再次识别中断。

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

关于linux - 如何在 Linux 中避免共享 IRQ 竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8815382/

相关文章:

linux - 如何使用 Unix/Linux 命令计算韩文字 block ?

c - 实现内存池

c - PIC32 UART 未接收数据

linux - 使用并行端口中断

linux - 检查挂起后恢复系统的Linux内核中断

java 获取 *NIX 上非当前用户的用户主目录

c++ - 线程循环 system() 和 cout 破坏堆栈

linux - Linux 环境中的 Perl 脚本无法通过 cron 运行

在 C 中控制对内存映射寄存器的读写访问宽度

linux - 我可以编写一个内核模块来处理软件中断吗?