【发布时间】:2012-02-07 13:54:16
【问题描述】:
我正在考虑嵌入式 Linux 项目(尚无硬件)中即将出现的情况,其中两个外部芯片需要共享一条物理 IRQ 线。这条线在硬件上可以边沿触发,但不能在电平触发中断。
查看 Linux 中的共享 irq 支持,我知道这与两个单独的驱动程序一起工作的方式是,每个驱动程序都会调用它们的中断处理程序,检查它们的硬件并在适当的情况下进行处理。
但是,我想像以下比赛条件,并想知道我是否遗漏了什么或可以采取什么措施来解决这个问题。假设有两个外部中断源,设备 A 和 B:
- 发生设备 B 中断,IRQ 变为活动状态
- IRQ 边缘导致 Linux 内核中断处理程序运行
- 设备 A 的 ISR 运行,发现没有挂起的中断
- 设备发生中断,IRQ 保持活动状态(线或)
- 设备 B 的 ISR 运行,找到挂起的中断,处理并清除它
- 核心中断处理程序退出
- IRQ 保持活动状态,不再生成边缘,IRQ 被锁定
似乎要解决这个问题,核心中断处理程序必须在运行所有处理程序后检查 IRQ 级别,如果仍然处于活动状态,则再次运行它们。 Linux会这样做吗?我认为中断核心不知道如何检查 IRQ 线的电平。
这场比赛真的会发生吗?如果是,我该如何处理?
【问题讨论】: