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

8

我目前正在尝试理解在ARM架构中使用GIC或指令以不同方式屏蔽/禁用中断之间的关系。

到目前为止,我已经了解到以下内容:

  • 可以用于启用/禁用处理器的中断。使用会禁用发出该指令的处理器的所有中断(通过设置寄存器),而使用则启用中断。这不会改变中断分配器或CPU接口的任何状态。
  • 特定中断可以通过向中断分配器中的GICD_ICENABLERn寄存器之一写入1来屏蔽。
  • 也可以通过在中断分配器中不设置目标来禁用特定中断。

迄今为止,我的理解正确吗?

现在我不清楚这些方法如何相互关联。我假设以下内容:

如果使用寄存器禁用中断,然后信号传递任何类型的中断(无论是电平触发还是边沿触发),那么CPU接口将被通知中断(假设其设置为目标),从而将中断状态更改为“待处理”。然后,只要发出指令,处理器将切换到中断处理。

然而,如果通过不设置目标来全局禁用中断并且信号传递了边沿触发中断,则CPU接口不会更改其状态。因此,如果稍后更改目标,则不会向任何CPU接口发送中断(因为触发器不再处于活动状态)。这意味着,在这种情况下会丢失边沿触发的中断。对于电平触发中断,只有在中断线仍保持断开状态时才会向CPU接口发送信号。这正确吗?还是分配器“记忆”状态并确定是否已传递中断,以便在两种情况下稍后分发中断?

现在,如果中断被屏蔽,则它将不会分配给任何CPU接口。但是,在这种情况下,我期望在取消屏蔽后稍后会分配中断。


2
你有尝试过阅读《ARM通用中断控制器架构规范》或者《ARM认证工程师学习指南》吗? - auselen
我已经查阅了 ARM GIC 架构规格说明书(版本 2),但它并未提及 cpsid 指令。我之前不知道还有学习指南,我会去看看的。 - LiKao
2个回答

5
主要是正确的。GIC是一个单独的块,用于多CPU设计。cpsiX指令位于ARM核心中。GIC进一步分为全局distributor(也称为distribution)和每个CPU的寄存器。因此,在四核系统中,你将拥有四组GIC每CPU,但只有一个distributor。每个核心的寄存器通常映射到相同的地址。当然,每个核心都有一个核心(cpsiX将适用于它)。您还可以使用每个CPU寄存器(例如GICC_PMR等)屏蔽中断,可能还可以直接使用外设寄存器(即以太网控制器具有一个中断使能,该中断信号GIC dist-> GIC per-CPU-> ARM核心)。如果是外部中断,则最后一个不适用。通常,许多GIC SPI实际上已经连接在芯片/ SOC上,因此可以禁用源。
这意味着,在此情况下,边缘触发中断会丢失。对于电平触发中断,只有在中断线仍被断言时,它们才会被信号传递到CPU接口。这正确吗?
这似乎是一般性的正确。但是,我会查看我们GIC实现的具体细节。通常,这是gic pl390或gic pl400。根据GIC版本和可用寄存器,屏蔽、挂起和取消的处理可能会非常复杂。例如,如果一个CPU可能被信号标记,但在它处理中断之前,另一个CPU已经读取并服务了中断。如果将中断路由到一个CPU,则不会发生这种情况。然后还有中断优先级和抢占中断。请参见ARM通用中断控制器 - 架构规范的第3.2.1章“优先级降低和中断去激活”。
对于边缘触发中断,需要在重新启用中断之前(在分配器级别)查看硬件是否需要服务。分配器将保持挂起状态,如果使用或每个CPU寄存器使能,则需要服务。

我对GICC_DIR的参考有些困惑。据我理解,这个寄存器只能用于关闭正在处理的中断(即正在服务的中断)。根据规范所述,“当中断优先级下降与中断关闭分离时,... 对该寄存器的写操作将关闭指定的中断。”当然,GICC_PMR屏蔽了中断(或者说根据优先级屏蔽了一组中断)。我之前忽略了这一点,谢谢你提醒。 - LiKao
你是对的。之前,我只是看了GIC规范,并列出了听起来像是禁用的CPU寄存器,但没有仔细阅读细节。可以确定的是,“PMR”旨在禁用/转移中断级别;非常相似但并不完全相同于启用/禁用。我已更新答案。 - artless noise

3

其他答案中提到的"分离块"方面,ARM CPU核心具有一个单独的低电平nIRQ线(和相应的nFIQ线)。CPSR位仅控制内部该核心对该信号作出的响应-无论何种原因引发它都只是等待一些响应而已,并不知道核心正在执行什么操作。

同样地,从另一个角度来看,虽然GIC CPU接口的设计具有低优先级中断输出和高优先级中断输出,以对应ARM核心的nIRQ和nFIQ,但这并不意味着它不能连接到其他设备上(规范甚至明确表示可以如此)。因此,GIC架构对于接收器如何处理这些信号几乎没有概念-如果端口的另一端是某个自定义DSP而非基于ARM的核心,则cps完全不相关。


1
这适用于GIC规范(连接DSP)。然而,由ARM发送的GIC核心(逻辑块)使用AXI协议。因此,您需要一个DSP来使用此总线协议。例如,Freescale Vybrid具有Cortex-A5和Cortex-M4,并且它有两个中断控制器。一个是GIC,另一个是NVIC(cortex-M AHB flavor)。因此,虽然理论上可以有一个DSP接口,但我不知道在实践中是否常见,事实上我认为这很难做到。除非ARM在未来采取措施(或者可能是高通,苹果,三星和AMD等公司),主要是AXI能力的DSP与另一个总线上的GIC。 - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接