文章目录
Chapter 7:Interrupts
7.1 Environment
本章描述了系统级中断环境和中断控制器的功能(见图7-1)。PS基于ARM架构,使用两个Cortex-A9处理器(CPU)和GIC PL390中断控制器。中断结构与CPU和接受来自I/O外围设备(IOP)和可编程逻辑(PL)的中断。本章包括以下关键主题:
- 私有、共享和软件中断
- GIC功能
- 中断优先级和处理
7.1.1 Private, Shared and Software Interrupts![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/813c84e3f61feec26e8027388df9925d.png)
每个CPU都有一组专用外围设备中断(PPI),它们使用banked 寄存器进行专用访问。PPI包括全局计时器、专用看门狗计时器、专用计时器和来自PL的FIQ/IRQ。软件生成的中断(SGI)被路由到一个或两个CPU。SGI通过写入ICDSGIR寄存器生成。共享外围设备中断(SPI)由PS和PL中的各种I/O和内存控制器生成。它们被路由到任一个或两个CPU。来自PS外围设备的SPI中断也被路由到PL
7.1.2 Generic Interrupt Controller (GIC)
- 通用中断控制器(GIC)是用于管理从PS和PL发送到CPU的中断的集中资源。控制器启用、禁用、屏蔽和优先处理中断源,并在CPU接口接受下一个中断时以编程方式将它们发送到选定的CPU(或CPU)。此外,控制器支持实现安全感知系统的安全扩展
- 控制器基于ARM通用中断控制器架构版本1.0(GIC v1),非矢量化
- 寄存器通过CPU专用总线访问,通过避免互连中的临时阻塞或其他瓶颈,实现快速读/写响应
- 中断分发服务器将所有中断源集中起来,然后用最高的单个CPU的优先级。硬件确保针对多个CPU的中断只能一次被一个CPU占用。所有中断源都由唯一的中断ID号标识。所有中断源都有自己的可配置优先级和目标CPU列表
7.1.3 Resets and Clocks
- 中断控制器由重置子系统通过写入SLCR中的A9_CPU_rst_ctrl寄存器。同样的重置信号也会重置CPU专用定时器和专用看门狗定时器(awdt)
- 中断控制器使用CPU_3x2x时钟(CPU频率的一半)工作
7.1.4 Block Diagram
共享外设中断是由各种系统子系统生成的,这些子系统包括PS中的I/O外设和PL中的逻辑。中断源如图7-2所示
7.2 Functional Description
7.2.1 Software Generated Interrupts (SGI)
- 每个CPU可以使用软件生成的中断(SGI)中断自身、另一个CPU或两个CPU。有16个软件生成的中断(见表7-1)。SGI中断是通过写入到ICDSGIR寄存器并指定目标CPU的SGI中断号。此写入发生通过CPU自己的专用总线。每个CPU都有自己的一组SGI寄存器来生成一个或多个16个软件产生中断。CPU可以中断自身、另一个CPU或两个CPU。这个通过读取ICCIAR(中断确认)寄存器或将1写入ICDICPR(中断清除挂起)寄存器的相应位来清除中断
- 所有SGI都是边缘触发的。SGIS的敏感度类型是固定的,不能更改;ICDICFR0寄存器是只读的
7.2.2 CPU Private Peripheral Interrupts (PPI)
- 每个CPU连接到一个由五个共享外围设备中断组成的私有集。PPI见表7-2
- 所有中断敏感度类型都是固定的,不能更改。请注意,来自PL的快速中断(FIQ)信号和中断(IRQ)信号是反向的,然后发送到中断控制器。因此,尽管ICDICFR1寄存器将它们反映为低灵敏度的活动寄存器,但它们在PS-PL接口处处于高激活状态
7.2.3 Shared Peripheral Interrupts (SPI)
- 一组来自不同模块的大约60个中断可以路由到CPU或PL。中断控制器管理这些中断的优先级和接收,对于CPU
- 所有SPI中断类型的重置默认值都是活动的高级别。但是,软件需要使用ICDICFR2和ICDICFR5寄存器将中断32、33和92编程为上升沿灵敏度。SPI中断如表7-3所示
7.2.4 Wait for Interrupt Event Signal (WFI)
CPU可以进入等待状态,等待生成中断(或事件)信号。
发送到pl的等待中断信号在第3章,应用处理单元中描述
7.3 Register Overview
ICC和ICD寄存器是PL390 GIC寄存器集的一部分。有60个SPI中断。这远低于PL390所能支持的,因此ICD中的中断启用、状态、优先级和处理器目标寄存器比PL390所能支持的要少得多。表7-4列出了ICC和ICD寄存器的摘要
7.3.1 Write Protection Lock Down
- 中断控制器提供防止对关键配置进行写访问的功能寄存器。这是通过将一个写入apu ctrl[cfgsdisable]位来完成的。APU控制寄存器是EPP系统级控制寄存器集SLCR的一部分。这控制安全中断控制寄存器的写入行为
- 如果用户想要设置cfgsdisable位,建议在用户软件配置中断控制器后发生的软件引导过程寄存器。cfgsdisable位只能在cfgsdisable位已设置,它将受保护的寄存器位更改为只读,因此即使在安全域中存在执行的恶意代码,也无法更改这些安全中断的行为
7.4 Programming Model
7.4.1 Interrupt Prioritization
- 所有中断请求(PPI、SGI和SPI)都被分配一个唯一的ID号。
控制器使用ID号进行仲裁。中断分发服务器保存每个CPU的挂起中断列表,然后在将其发送到CPU接口之前选择最高优先级的中断。通过选择最低的ID来解决等优先级的中断 - 优先级逻辑在物理上是重复的,以便能够同时选择
每个CPU的优先级中断。中断分发服务器保存中断、处理器和激活信息的中心列表,并负责将软件中断触发到CPU - SGI和PPI分发寄存器被存入bank,以便为每个连接的处理器提供单独的副本。硬件确保针对多个CPU的中断一次只能由一个CPU占用
- 中断分配器向CPU接口发送最高的挂起中断。它接收返回已确认中断的信息,然后可以更改相应的中断。只有确认中断的CPU才能结束该中断
7.4.2 Interrupt Handling
- 当在ARM中描述IRQ线路取消断言时,GIC对挂起中断的响应。文件:ihi0048b_gic_architecture_specification.pdf(见附录A,附加资源)。见第1.4.2节中的注释以及第3.2.4节中的附加信息
- 如果中断在gic中挂起并且irq被取消断言,gic中的中断将变为非活动状态(并且CPU从未看到它)
- 如果中断在gic中处于活动状态(因为CPU接口已确认中断),则软件ISR首先检查gic寄存器,然后轮询I/O外围设备中断状态寄存器,确定原因
7.4.3 ARM Programming Topics
ARM GIC体系结构规范包括以下编程主题:
- GIC寄存器访问
- 分发服务器和CPU接口
- GIC安全扩展的影响
- PU接口寄存器
- 保留和恢复控制器状态
7.4.4 Legacy Interrupts and Security Extensions
- 当传统的中断(IRQ, FIQ) 是用来处理一个中断,中断和访问的安全模式(fiqs ackctl iccicr [路径] = 1),偶尔会发生竞态条件,当读取中断IDs时。在IRQ处理程序中还存在看到FIQ ID的风险,因为GIC只知道处理程序正在读取的安全状态,而不知道处理程序的类型
有两种可行的解决方案:
- 仅向可重入IRQ处理程序发送IRQ信号,并使用GIC中的抢占功能。
- 将FIQ和IRQ与ICICR[ackctl]=0一起使用,并使用TLB表处理非安全的IRQ模式,并在安全模式下处理FIQ