CPSID指令与ARM上Generic Interrupt Controller的关系
Relationship between CPSID instruction and Generic Interrupt Controller on ARM
我目前正在尝试了解使用 GIC 或 cps
指令在 ARM 架构上 mask/disable 中断的不同方式之间的关系。
到目前为止,我收集了以下信息:
cps
可用于 enable/disable 处理器的中断。使用 cpsid i
禁用发出指令的处理器的所有中断(通过设置 cpsr
寄存器),使用 cpsie i
启用中断。这不会更改中断分发器或 CPU 接口的任何状态。
- 可以通过将
1
写入中断分配器中 GICD_ICENABLERn
寄存器之一的相应位来屏蔽特定中断。
- 也可以通过在中断分配器中不设置任何目标来禁用特定中断。
到目前为止,这种理解是否正确?
目前我还不清楚这些方法之间的关系。我假设如下:
如果使用 cpsr
寄存器禁用中断,然后发出任何类型的中断信号(无论是电平还是边沿触发),然后 cpu 接口将被通知中断(假设它被设置为目标),这会将中断的状态更改为 pending
。然后一旦发出 cpsie i
指令,处理器就会切换到中断处理。
但是,如果通过不设置目标来全局禁用中断,并且发出边沿触发中断信号,CPU 接口将不会更改其状态。因此,如果稍后更改目标,则不会向任何 CPU 接口发出中断信号(因为触发器不再处于活动状态)。这意味着,在这种情况下边沿触发中断会丢失。对于电平触发的中断,如果中断线路仍然有效,则这些中断只会向 CPU 接口发出信号。这个对吗?或者 Distributor "remember" 状态以及是否已发出中断信号,以便在这两种情况下稍后分发中断?
现在如果中断被屏蔽,它不会再分配给任何CPU接口。然而,在那种情况下,我希望中断在稍后揭露时分发。
Is this understanding correct so far?
主要是正确的。 GIC 是一个单独的块,用于多 CPU 设计。 cpsiX
指令在 ARM 内核中。 GIC 进一步分为全球 分销商 (也称为 分销商 )以及 per-CPU 寄存器。因此,在一个四核系统中,每个 CPU 将有四套 GIC,但只有一个 分发器 。每个内核的寄存器通常映射到每个内核的相同地址。当然每个核心都会有一个核心(并且cpsiX
将适用于它)。
你也可以mask per-CPU 寄存器如GICC_PMR
等的中断,也可能直接使用外设寄存器(即以太网控制器有一个中断使能信号 GIC dist -> GIC per-CPU -> ARM core)。如果它是 外部 中断,最后一个将不适用。通常许多 GIC SPI 实际上是有线的 on-chip/SOC,因此您可以禁用源。
This would mean, that edge triggered interrupts are lost in this case. For level triggered interrupts, these would only be signaled to the CPU Interfaces, if the interrupt line is still asserted. Is this correct?
这似乎大体上是正确的。但是,我会查看我们的 GIC 实施的细节。通常,这是 gic pl390 或 gic pl400。根据可用的 GIC 版本和寄存器,屏蔽、挂起和取消的处理可能非常复杂。例如,如果 CPU 可能发出信号但在它处理中断之前,另一个 CPU 已经读取并服务于中断。如果您仅将中断路由到一个 CPU,则不会发生这种情况。然后是中断优先级和优先中断。请参阅 ARM Generic Interrupt Controller - Architecture Specification.
的 3.2.1 优先级下降和中断停用 章
对于边沿触发中断,您需要在重新启用中断之前(在分发器级别)查看硬件是否需要维修。如果使用 cpsie
或 per-CPU 寄存器启用,分发器将保持挂起状态。
为了扩展 中提到的 "separate block" 方面,一个 ARM CPU 内核有一个 单 低电平有效 nIRQ 线(和相应的 nFIQ 行)。 CPSR 位只控制内核如何在内部响应该信号——无论断言它只是坐在另一端等待某种响应并且不知道内核在做什么。
同样,从另一个角度来看,虽然GIC CPU接口设计了一个低优先级中断输出和一个高优先级中断输出来对应ARM内核的nIRQ和nFIQ,但没有理由它不能连接到其他东西(规范甚至明确说明了这一点)。因此,GIC 架构几乎不知道这些信号的接收器如何处理它们 - cps
如果另一端有一些自定义 DSP,而不是 ARM 架构核心,则完全无关紧要。
我目前正在尝试了解使用 GIC 或 cps
指令在 ARM 架构上 mask/disable 中断的不同方式之间的关系。
到目前为止,我收集了以下信息:
cps
可用于 enable/disable 处理器的中断。使用cpsid i
禁用发出指令的处理器的所有中断(通过设置cpsr
寄存器),使用cpsie i
启用中断。这不会更改中断分发器或 CPU 接口的任何状态。- 可以通过将
1
写入中断分配器中GICD_ICENABLERn
寄存器之一的相应位来屏蔽特定中断。 - 也可以通过在中断分配器中不设置任何目标来禁用特定中断。
到目前为止,这种理解是否正确?
目前我还不清楚这些方法之间的关系。我假设如下:
如果使用 cpsr
寄存器禁用中断,然后发出任何类型的中断信号(无论是电平还是边沿触发),然后 cpu 接口将被通知中断(假设它被设置为目标),这会将中断的状态更改为 pending
。然后一旦发出 cpsie i
指令,处理器就会切换到中断处理。
但是,如果通过不设置目标来全局禁用中断,并且发出边沿触发中断信号,CPU 接口将不会更改其状态。因此,如果稍后更改目标,则不会向任何 CPU 接口发出中断信号(因为触发器不再处于活动状态)。这意味着,在这种情况下边沿触发中断会丢失。对于电平触发的中断,如果中断线路仍然有效,则这些中断只会向 CPU 接口发出信号。这个对吗?或者 Distributor "remember" 状态以及是否已发出中断信号,以便在这两种情况下稍后分发中断?
现在如果中断被屏蔽,它不会再分配给任何CPU接口。然而,在那种情况下,我希望中断在稍后揭露时分发。
Is this understanding correct so far?
主要是正确的。 GIC 是一个单独的块,用于多 CPU 设计。 cpsiX
指令在 ARM 内核中。 GIC 进一步分为全球 分销商 (也称为 分销商 )以及 per-CPU 寄存器。因此,在一个四核系统中,每个 CPU 将有四套 GIC,但只有一个 分发器 。每个内核的寄存器通常映射到每个内核的相同地址。当然每个核心都会有一个核心(并且cpsiX
将适用于它)。
你也可以mask per-CPU 寄存器如GICC_PMR
等的中断,也可能直接使用外设寄存器(即以太网控制器有一个中断使能信号 GIC dist -> GIC per-CPU -> ARM core)。如果它是 外部 中断,最后一个将不适用。通常许多 GIC SPI 实际上是有线的 on-chip/SOC,因此您可以禁用源。
This would mean, that edge triggered interrupts are lost in this case. For level triggered interrupts, these would only be signaled to the CPU Interfaces, if the interrupt line is still asserted. Is this correct?
这似乎大体上是正确的。但是,我会查看我们的 GIC 实施的细节。通常,这是 gic pl390 或 gic pl400。根据可用的 GIC 版本和寄存器,屏蔽、挂起和取消的处理可能非常复杂。例如,如果 CPU 可能发出信号但在它处理中断之前,另一个 CPU 已经读取并服务于中断。如果您仅将中断路由到一个 CPU,则不会发生这种情况。然后是中断优先级和优先中断。请参阅 ARM Generic Interrupt Controller - Architecture Specification.
的 3.2.1 优先级下降和中断停用 章对于边沿触发中断,您需要在重新启用中断之前(在分发器级别)查看硬件是否需要维修。如果使用 cpsie
或 per-CPU 寄存器启用,分发器将保持挂起状态。
为了扩展
同样,从另一个角度来看,虽然GIC CPU接口设计了一个低优先级中断输出和一个高优先级中断输出来对应ARM内核的nIRQ和nFIQ,但没有理由它不能连接到其他东西(规范甚至明确说明了这一点)。因此,GIC 架构几乎不知道这些信号的接收器如何处理它们 - cps
如果另一端有一些自定义 DSP,而不是 ARM 架构核心,则完全无关紧要。