ARM Cortex-R52 GIC:Generic Interrupt Controller
1.关于GIC
1.1 GIC Overview
ARM的中断控制器被称为GIC(Generic Interrupt Controller),GIC是支持和管理系统中断的资源的模块。它支持中断优先级、中断路由到CPU或输出端口、中断抢占和中断虚拟化等功能。
中断控制器是中断源(外设)和CPU之间的桥梁;
1.2 GIC 架构
在多核时代中,中断控制器被分成两个部分可以更好地支持和管理多处理器系统中的中断。其中一部分是连接外设中断源的I/O APIC,由所有CPU共享。I/O APIC可以通过向指定的CPU发送中断消息实现并发中断处理。另一部分是Local APIC,与每个CPU对应,用于控制本地处理器的中断。它可以在单个处理器上快速响应和处理中断请求,在多处理器环境中也可以把中断请求发送到其他处理器或者操作系统内核来协调处理,从而提高中断处理的效率。
总之,随着多处理器技术的不断发展,中断控制器变得越来越复杂,但也使得系统更加灵活和高效。
1.3 ARM R52 GIC-v3架构
Cortex-R52处理器采用了ARM公司推出的GIC V3架构,这是一种高度灵活和可扩展的中断控制器架构,特别适用于多核处理器系统。GIC V3架构包括一个内部的GIC分配器(Distributer),每个核还包含一个GIC重分配器(Redistributor)。
GIC Distributer类似于传统计算机系统中的I/O APIC,它负责将来自各种中断源的中断请求转发给相应的Redistributor,并根据CPU的配置和优先级设置进行派发。与传统的I/O APIC不同的是,GIC Distributer还支持像处理器间直接消息传递(Inter-Processor Interrupt,IPI)这样的特殊中断类型,可以通过GIC协议灵活地配置和管理各种中断源。
GIC Redistributor类似于传统计算机系统中的Local APIC,它负责为每个CPU接收并处理来自Distributer派发的中断请求,以及发送处理器间直接消息传递(IPI)的请求。GIC Redistributor可以访问Distributer的寄存器和内存映射区域,以获取有关中断状态和优先级的信息,并根据这些信息向处理器发送中断或IPI请求。此外,GIC Redistributor还支持处理器仲裁,以确保同一时间只有一个CPU处理具有相同优先级的中断。
distributor: SPI中断的管理,将中断发送给redistributor;
redistributor: PPI,SGI,LPI中断的管理,将中断发送给cpu interface;
cpu interface: 传输中断给 core;
cpu interface 是实现在 core 内部的,distributor,redistributor,ITS是实现在gic内部的.
2.GIC 功能描述
GIC分配器接收外设(SPI)和核心(PPI)的有线中断。 GIC分配器仲裁路由到每个核心的中断以确定最高优先级挂起中断(HPPI),然后将其传递给GIC CPU界面。 来自核的激活,去激活和软件生成的中断通过GIC CPU接口传递以更新GIC分配器的状态。 GIC分配器包含内存映射的配置和状态寄存器。 GIC分配器包含每个中断目标一个再分配器。 再分配器主要负责包含PPI和SGI的寄存器。
GIC CPU接口包括处理物理中断的部分和处理虚拟中断的部分。 GIC CPU接口包含可作为系统寄存器访问的配置和状态寄存器。 中断被配置为Group 0中断或Group 1中断。 Group 0中断使用FIQ发出信号,而Group 1中断使用IRQ发出信号。
GIC CPU接口处理物理中断的部分从GIC分配器接收HPPI。 它执行抢占计算并向核心发出FIQ或IRQ信号。 来自核心的激活,去激活和软件生成的中断通过CPU接口传回到分配器。 GIC CPU接口处理虚拟中断的部分最多可以包含四个虚拟中断,其中优先级最高的用于向核心生成虚拟FIQ或虚拟IRQ。
2.1 中断源分类
GIC中断源的编号从0开始,0到15是SGI(Software Generated Interrupt),所谓"software generated"。
编号16到31是PPI(Private Peripheral Interrupt),所谓"private",是指这个中断为CPU私有/专用。
与专有的PPI相对应的就是所有CPU全局共享的SPI(Shared Peripheral Interrupt),编号从32到1020。
2.1.1 Private Peripheral Interrupts (PPIs)
PPI(Private Peripheral Interrupts,私有外设中断)是由特定于单个核心的外设产生的有线中断。每个核心具有16个PPI,INTID16-INTID31。输出接口不支持PPI。没有被分配使用的PPI将作为Cortex-R52处理器顶层的额外中断输入提供。配置未分配的PPI可以选择上升沿触发或低电平触发。
那什么中断会有这种特性呢?
比如通用定时器中断啊,温度传感器中断之类的。
2.1.2 Shared Peripheral Interrupts (SPIs)
SPI是一种由特定于单个核心的外设产生的有线中断,可以被通过软件配置路由到一个特定的核。每个Cortex-R52处理器都具有960个可配置的SPI,这些SPI作为处理器的顶层输入信号提供给其他组件使用。
那么如何确定哪些SPI被分配给哪个核心?
在每个核心中,通过低延迟硬件将32个唯一的SPI路由到该核心,而其他所有核心则使用常规延迟硬件将同样的SPI路由到它们。对于每个核心而言,INTID(32x+32)到INTID(32x+63)的SPI被视为低延迟(其中x = 0、1、2或3),即它们具有更快的响应时间和更高的优先级,可以更快地从硬件设备接收并处理SPI中断请求。
最后,每个SPI都可以配置为上升沿触发或高电平触发,并且通过编程相应的SPI路由信息来实现。SPI[0]对应于INTID32,而SPI[30]对应于INTID991。
2.1.3 Software Generated Interrupts (SGIs)
指由 CPU 直接写对应的寄存器触发中断,因而这种中断不是由硬件产生的,而是由软件主动产生的。这种特殊的中断主要用于核间通信。当处理器需要中断应用程序执行时,可以使用SGI生成中断信号。SGI的数量有限,每个CPU核只能生成16个SGI,每个SGI都有一个独特的编号(INTID0-INTID15)。SGI是边沿触发中断,在生成SGI时,SGI信号会从低电平跳变到高电平,然后维持高电平状态,直到中断服务程序将其清除为止。这些属性使SGI非常适合进行异步通信和同步协议的实现,并可用于更好地支持多处理器系统。
SGI (Software Generated Interrupt) 和 PPI (Private Peripheral Interrupt) 都是 ARM 处理器中的中断信号。每个 CPU 核都有自己的 SGI 或 PPI 中断,不同核的同种类型中断共享相同的编号。因此,它们都采用了 “banked” 形式的中断源,即每个 CPU 核都可以接收到来自同一种类型中断的信号,但是在处理中断时会根据中断编号进行区分和处理。其中,SGI 是由软件触发的中断,用于处理特定的事件或情况。PPI 则是专门为外围设备设计的中断,用于处理与外设相关的事件或情况。这些中断信号都有各自的优先级,并按照优先级高低被处理。这种中断机制可以使系统在出现多个异步事件时能够快速响应并作出正确的处理。
参考阅读:
https://blog.csdn.net/sinat_32960911/article/details/128083997
https://blog.csdn.net/weixin_42135087/article/details/107039588
https://zhuanlan.zhihu.com/p/85313527
https://zhuanlan.zhihu.com/p/90074320
https://zhuanlan.zhihu.com/p/85313527
https://blog.csdn.net/weixin_42135087/article/details/111713444
https://blog.csdn.net/yhb1047818384/article/details/86708769
https://blog.csdn.net/qijiuliushisan/article/details/112384636
https://zhuanlan.zhihu.com/p/443815543