使用ARM GIC(全局中断控制器)禁用中断



我有一个特定的要求,我需要在不影响其他中断的情况下禁用设备中断一段特定的时间(在ARM处理器上运行的代码)。ARM文档指出,ARM的所有GIC寄存器(与启用、禁用和清除中断有关)都是Banked寄存器,即每个CPU接口有一个。可从指定CPU访问的存储体寄存器,并仅控制CPU的PPI和SGI中断。

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

GIC有两个寄存器集;每个CPU的存储体集合和分布(也是分配器),后者是GIC的系统全局。对于上面的链接,IrqEnSet0是每个CPU的寄存器,它(再次)被存储并处理到CPU的PPI和SGI中断。IrqEnSet1是全局中断的列表,这些中断可能被禁用。分发(也称为分配器)也可以将某些中断作为CPU的目标。

ARM对这些寄存器和GIC的不同版本有许多不同的名称。所有这些概念都是相同的。每个CPU都有一组寄存器,这些寄存器全局控制,包括在系统范围内禁用中断。希望读者有足够的能力找到并阅读SOC的特定控制器文档。

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

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

这些中断只对每个CPU有意义。然而,以太网、SPI、视频、CAN总线、i2c、ADC等硬件通常是系统全局的。

对于分配器寄存器,全局中断通常具有读/写启用/禁用功能。每个CPU寄存器可能是分配器中的只读,表示存在中断。另一组寄存器(每个CPU)是启用/禁用每个CPU中断的正常机制。当访问分发服务器时,软件应该有一个互锁(信号量),因为它对系统是全局的。或者,只有选择的或引导CPU才会使用分发服务器。每个CPU的寄存器都是存储体的,因此核心可以执行读取-修改-写入,而不必担心竞争条件。

参考:ARM通用中断控制器-体系结构规范,可能需要注册。

最新更新