我目前正试图了解使用GIC或cps
指令屏蔽/禁用ARM架构中断的不同方法之间的关系。
到目前为止,我收集了以下内容:
cps
可用于启用/禁用处理器的中断。使用cpsid i
禁用发出指令的处理器的所有中断(通过设置cpsr
寄存器),并使用cpsie i
启用中断。这不会更改中断分配器或CPU接口的任何状态。1
写入中断分配器中GICD_ICENABLERn
寄存器中的相应位,可以屏蔽特定中断。到目前为止,这种理解是否正确?
现在我不清楚这些方法是如何相互关联的。我假设如下:
如果使用cpsr
寄存器禁用中断,然后发出任何类型的中断信号(无论是否触发电平或边沿),则会通知cpu接口中断(假设它被设置为target),它将中断状态更改为pending
。然后,只要发出cpsie i
指令,处理器就会切换到中断处理。
但是,如果通过设置无目标来全局禁用中断,并且发出边沿触发中断信号,则CPU接口将不会更改其状态。因此,如果稍后更改目标,则不会向任何CPU接口发出中断信号(因为触发器不再处于活动状态)。这意味着,在这种情况下,边沿触发的中断会丢失。对于电平触发中断,如果中断线仍然有效,则只会向CPU接口发送信号。它是否正确?或者经销商"记得"状态以及是否已发出中断信号,以便在以下两种情况下都会分配中断?
现在,如果中断被屏蔽,它将不会再分发到任何CPU接口。但是,在这种情况下,我希望稍后在取消屏蔽时分发中断。
答案 0 :(得分:4)
到目前为止,这种理解是否正确?
主要是正确的。 GIC是一个单独的块,适用于多CPU设计。 cpsiX
指令位于ARM内核中。 GIC进一步分为全局分发商(也称为发行版)以及 per-CPU 寄存器。因此,在四核系统中,每个CPU将有四组GIC,但只有一组分销商。每核心寄存器通常映射到每个核心的相同地址。当然,每个核心都有一个核心(cpsiX
将适用于它)。
您还可以使用每个CPU寄存器(例如GICC_PMR
等)屏蔽中断,也可以直接使用外设寄存器(即,以太网控制器具有中断启用信号, GIC dist - > GIC per-CPU - > ARM内核)。如果它是外部中断,则最后一个不适用。通常许多GIC SPI实际上都是片上/ SOC,因此您可以禁用源。
这意味着,在这种情况下,边沿触发的中断会丢失。对于电平触发中断,如果中断线仍然有效,则只会向CPU接口发送信号。这是对的吗?
这似乎是正确的。但是,我会看一下我们GIC实施的细节。通常,这是 gic pl390 或 gic pl400 。根据可用的GIC版本和寄存器,可能非常涉及屏蔽,挂起和取消的处理。例如,如果CPU可能发出信号但在处理中断之前,另一个CPU已经读取并处理了中断。如果将中断路由到只有一个CPU,则不会发生这种情况。然后是中断优先级和中断中断。请参阅ARM Generic Interrupt Controller - Architecture Specification的 3.2.1优先级丢弃和中断取消激活章节。
对于边沿触发中断,如果需要维护硬件,则需要在重新启用中断(在分发器级别)之前查看。如果使用cpsie
或每个CPU寄存器启用,分发器将保持挂起状态。
答案 1 :(得分:2)
为了扩展the other answer中提到的“单独块”方面,ARM CPU内核具有单低电平有效nIRQ线(以及相应的nFIQ线)。 CPSR位仅控制内核如何在内部响应该信号 - 无论断言它只是坐在另一端等待某种响应并且不知道核心在做什么。
同样,从另一个角度来看,虽然GIC CPU接口设计有低优先级中断输出和高优先级中断输出,以与ARM内核的nIRQ和nFIQ相对应,但没有理由不能挂钩达到其他目的(规范甚至明确表示这一点)。因此,GIC架构几乎没有关于这些信号的接收器对它们做什么的概念 - 如果在另一端有一些自定义DSP而不是ARM架构核心,则cps
完全无关紧要。