ARM上CPSID指令与通用中断控制器的关系

LiK*_*Kao 5 assembly arm interrupt

我目前正在尝试使用GIC或cps指令来理解在ARM体系结构上屏蔽/禁用中断的不同方法之间的关系.

到目前为止我收集了以下内容:

  • cps可用于启用/禁用处理器的中断.使用cpsid i禁用发出指令的处理器的所有中断(通过设置cpsr寄存器),并使用cpsie i启用中断.这不会更改中断分配器或CPU接口的任何状态.
  • 通过写入中断分配器1中的一个GICD_ICENABLERn寄存器中的相应位,可以屏蔽特定中断.
  • 也可以通过在中断分配器中设置无目标来禁用特定中断.

到目前为止这种理解是否正确?

现在我目前还不清楚这些方法是如何相互关联的.我假设如下:

如果使用cpsr寄存器禁止中断,然后发出任何类型的中断信号(无论是否触发电平或边沿),则会通知cpu接口中断(假设它被设置为目标),这会改变状态中断到pending.然后,只要发出cpsie i指令,处理器就会切换到中断处理.

但是,如果通过设置无目标来全局禁用中断,并且发出边沿触发中断信号,则CPU接口将不会更改其状态.因此,如果稍后更改目标,则不会向任何CPU接口发出中断信号(因为触发器不再处于活动状态).这意味着,在这种情况下,边沿触发的中断会丢失.对于电平触发中断,如果中断线仍然有效,则只会向CPU接口发送信号.它是否正确?或者分销商"记住"状态以及是否已发出中断信号,以便在两种情况下中断都会被分发?

现在,如果中断被屏蔽,它将不会再分发到任何CPU接口.但是,在这种情况下,我希望稍后在取消屏蔽时分发中断.

art*_*ise 5

到目前为止,这种理解是否正确?

主要是对的。GIC 是一个单独的块,用于多 CPU 设计。该cpsiX指令在ARM内核。GIC 进一步分为全局分布器(也称为分布)和每个 CPU寄存器。因此,在四核系统中,每个 CPU 将有四组 GIC,但只有一个分配器。每个内核的寄存器通常映射到每个内核的相同地址。当然,每个核心都会有一个核心(并且cpsiX将适用于它)。

您还可以使用 per-CPU 寄存器(例如等)以及可能直接使用外设寄存器来屏蔽中断GICC_PMR(即,以太网控制器具有中断使能,它向 GIC dist -> GIC per-CPU -> ARM 内核发出信号)。如果是外部中断,则最后一个将不适用。通常,许多 GIC SPI 实际上是连接在片上/SOC 上的,因此您可以禁用源。

这意味着,在这种情况下,边缘触发的中断会丢失。对于电平触发中断,如果中断线仍被断言,这些只会被发送到 CPU 接口。这样对吗?

这似乎大体上是正确的。但是,我会查看我们 GIC 实施的细节。通常,这是gic pl390gic pl400。根据可用的 GIC 版本和寄存器,屏蔽、挂起和取消的处理可能相当复杂。例如,如果一个 CPU 可能发出信号,但在它处理中断之前,另一个 CPU 已经读取并处理了中断。如果您只将中断路由到一个 CPU,则不会发生这种情况。然后是中断优先级和强制中断。见章3.2.1优先级降和中断失活的的ARM通用中断控制器-建筑规范

对于边缘触发的中断,如果硬件需要服务,您需要在重新启用中断(在分发服务器级别)之前查看。分配器将保持挂起状态,以及是否使用cpsie了每个 CPU 寄存器启用。