使用 ARM GIC(全局中断控制器)禁用中断
Posted
技术标签:
【中文标题】使用 ARM GIC(全局中断控制器)禁用中断【英文标题】:Disabling interrupt with the ARM GIC (global interrupt controller) 【发布时间】:2014-11-06 07:16:39 【问题描述】:我有一个特定要求,我需要在特定时间段内禁用我的设备中断而不影响其他中断(在 ARM 处理器上运行的代码)。 ARM 文档指出,ARM 的所有 GIC 寄存器(与启用、禁用和清除中断有关)都是 Banked 寄存器,即每个 CPU 接口都有一个。可从指定 CPU 访问的分组寄存器,并仅控制 CPU 的 PPI 和 SGI 中断。
这是什么意思?如果我通过写入 GIC 寄存器来禁用特定中断,是仅在该内核上禁用还是在所有内核上禁用?
【问题讨论】:
你使用什么处理器?有许多类型的 ARM 处理器和其他第三方产品。您的“我的设备中断”是如何在您的系统中实现的?您的问题缺少许多系统细节。 有很多ARM GIC questions on stack-overflow可能对阅读有帮助。 【参考方案1】:GIC 有两个寄存器组;每个 CPU 集和 distribution(也是 distributor),它是 GIC 的全局系统。对于上面的链接,IrqEnSet0
是一个每个 CPU 的寄存器,它被存储(再次)并处理对 CPU 的 PPI 和 SGI 中断。 IrqEnSet1
是一个全局中断列表,这些中断可能会被禁用。 distribution(也称为distributor)也可以针对 CPU 的某些中断。
ARM 对这些寄存器和 GIC 的different versions 有许多不同的名称。所有这些概念都是相同的。有一组寄存器不是按 CPU 存储的,这些寄存器在全局范围内控制事物,包括禁用系统范围的中断。希望读者有能力找到并阅读其 SOC 的特定控制器文档。
PPI - 外围私有中断。例如,SMP 系统中的每 CPU 计时器。 SGI - 软件产生的中断。在其他系统上也称为 IPI。这允许从一个 CPU 向另一个 CPU 发送信号。 (IPI 是处理器间中断)。这是什么意思?如果我通过写入 GIC 寄存器来禁用特定中断,是仅在该内核上禁用还是在所有内核上禁用?
这些中断只对每个 CPU 有意义。但是,以太网、SPI、视频、CAN 总线、i2c、ADC 等硬件通常是系统全局的。
对于 distributor 寄存器,通常全局中断具有读/写启用/禁用。 per-CPU 的寄存器在分发器中可能是只读 的,表明存在中断。另一组寄存器(每个 CPU)是启用/禁用每个 CPU 中断的正常机制。软件在访问分发器时应该有一个互锁(信号量),因为它对系统来说是全局的。或者,只有一个选举 em>或启动CPU将使用分销商。每个 CPU 的寄存器被存储起来,因此内核可以执行 read-modify-write 而不必担心竞争条件。
参考:ARM Generic Interrupt Controller - Architecture Specification,可能需要注册。
【讨论】:
为了让大家的生活变得异常艰难,ARM 更改了寄存器的名称。 架构规范的附录 B 是不同版本 GIC 控制器上不同 ARM 文档之间的罗塞塔石碑。以上是关于使用 ARM GIC(全局中断控制器)禁用中断的主要内容,如果未能解决你的问题,请参考以下文章