使用 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 的特定控制器文档。

这是什么意思?如果我通过写入 GIC 寄存器来禁用特定中断,是仅在该内核上禁用还是在所有内核上禁用?

PPI - 外围私有中断。例如,SMP 系统中的每 CPU 计时器。 SGI - 软件产生的中断。在其他系统上也称为 IPI。这允许从一个 CPU 向另一个 CPU 发送信号。 (IPI 是处理器间中断)。

这些中断只对每个 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(全局中断控制器)禁用中断的主要内容,如果未能解决你的问题,请参考以下文章

SylixOS中GIC通用中断控制器——GIC简介

Linux中断 - GIC代码分析

linux kernel的中断子系统之:GIC代码分析

ARM GIC-400 寄存器

吐血整理 | 肝翻 Linux 中断所有知识点

linux gic驱动