AM243x 集成了多个中断控制器,负责管理和分发跨不同核心和子系统的中断事件:
-
安全通道或通用微控制器单元(MCU_M4FSS)
- 基于单核的 Cortex-M4F 处理器
- 集成嵌套向量中断控制器(NVIC)
-
微处理器单元(A53SS0)
- 双核 A53 集群
- SoC 级通用中断控制器(GICSS0),支持双 A53 核心
-
实时微控制器单元(R5FSS0,R5FSS1)
- 双核 R5F 集群
- 向量化中断管理器(VIM)
-
工业通信子系统(PRU_ICSSG0,PRU_ICSSG1)
- 两个可编程实时单元(PRU)
- 本地中断控制器(INTC)
系统的大多数事件都会直接路由到各种处理单元,但在某些情况下(例如 GPIO 事件),直接路由可能不切实际。因此,SoC 集成了全局中断路由器(INTRTR) 。
每个中断路由器汇总多个系统事件,并通过简单的组合逻辑(例如复用器组)将每个事件路由到相应的处理单元。事件的选择通过路由器内的相关寄存器控制。
GICSS0
AM243x 没有 A 核,所以没有 GICSS0。简要了解一下。
GICSS (Generic Interrupt Controller Subsystem) 是基于 Arm GIC-500 架构的模块。GIC-500 是高性能的中断控制器,遵循 Arm GICv3 标准,专门为处理器内核(如 Cortex-A53)设计。GICSS 主要负责检测、管理和分发系统中断,尤其是对双核 Cortex-A53 集群的中断。
GICSS 通过 GIC Stream Protocol Interface 与处理器的核心直接通信。这种直接通信方式降低了中断延迟,并可以灵活地根据特定规则路由中断到不同的处理器核心。
GICSS 主要功能
GICSS 的主要功能和特性包括:
-
16 个软件生成的中断 (SGIs) 每核: 这些中断主要用于处理器之间的通信(例如,在多核系统中,用于处理器间信号的传递)。
-
16 个专用外设中断 (PPIs) 每核: 这些中断与特定的处理器核心绑定,用于专门处理核心相关的外设事件。
-
256 个共享外设中断 (SPIs): 这些中断可以通过编程路由到系统中的任意处理器核心,适用于多处理器系统的共享资源管理。
-
本地特定外设中断 (LPIs): LPIs 是通过消息生成的中断,适用于较大规模的系统,支持更高的可扩展性。这些中断信息存储在内存中,GICSS 会缓存最近使用的中断信息,以减少中断处理的延迟。
-
中断优先级管理: 每个中断都有 32 级优先级,GICSS 会根据优先级来调度中断的处理。
-
三种中断组:
- Group 0: 主要用于处理安全领域的高优先级中断。
- 非安全组 1: 处理普通应用中的中断。
- 安全组 1: 处理需要安全保障的中断,例如涉及到安全处理环境的任务。
GICSS 还支持以下功能:
- 中断翻译服务(ITS): 支持设备隔离和基于消息的中断 ID 翻译,使虚拟机能够直接编程设备。
- 中断屏蔽和优先级控制: 可编程化中断路由,支持基于不同处理器的亲和性进行中断调度。
GICSS 的集成与架构
GICSS 的时钟与复位
GICSS 的工作需要依赖系统时钟和复位信号,图中显示了该模块与系统的集成架构:
- PLLCTRL0:提供系统时钟。
- MAIN_SYSCLK0:主要的系统时钟信号。
- GICSS0_RST:复位信号,用于初始化或重置 GICSS 模块。
- LPSC0:本地电源管理控制器,负责 GICSS 模块的电源管理。
总线协议转换(AXI2VBUSM 和 VBUSM2AXI)
GICSS 中实现了 AXI2VBUSM 和 VBUSM2AXI 桥接模块,用于系统不同总线之间的协议转换:
- AXI2VBUSM: 将标准的 64 位 AXI4 控制器接口转换为 64 位 VBUSM 写入/读取控制器接口。这种转换让系统可以更好地处理 AXI 和 VBUSM 之间的流量。
- VBUSM2AXI: 将 32 位的 VBUSM 控制器接口转换为 32 位 AXI4 外设接口,允许 GICSS 访问外部设备。
GICSS 中断类型
GICSS 处理四种主要的中断类型,每种中断类型都有特定的用途和处理机制:
- 软件生成的中断 (SGIs): 共 16 个,ID 为 0 到 15。主要用于多核处理器间通信。可以通过 Arm 系统寄存器或软件生成的中断寄存器 (GICD_SGIR) 来发送。
- 专用外设中断 (PPIs): 共 16 个,ID 为 16 到 31。与特定的处理器核心关联,专门用于处理该核心的外设事件。这些中断可以被编程为低电平有效或上升沿触发。
- 共享外设中断 (SPIs): 共 256 个,ID 为 32 到 288。这些中断可以被路由到任意核心或集群,并可以编程为高电平有效或上升沿触发。
- 本地特定外设中断 (LPIs): GICSS 支持多达 57344 个 LPI。这些中断通常用于基于消息的设备中断,通过 GICSS 外设接口生成。LPI 的相关信息存储在内存中,并且 GICSS 内部维护了一个 64 项缓存,减少中断处理延迟。
GICSS 的接口与中断输出
GICSS 与系统的主要通信接口包括:
- 64 位 VBUSM 只写和只读控制器接口:AXI2VBUSM 桥将标准 64 位 AXI4 控制器接口转换为两个只写和只读接口,以访问 ITS 和 Redistributor 的内存。
- 32 位 VBUSM 外设接口:用于访问 Arm GIC-500 的内部资源,处理消息型中断。
- 物理中断信号接口:接收 CPU 活跃信号、SPI 和 PPI 信号,输出错误信号和唤醒请求信号。
中断输出信号则包括:
- AXI 错误中断 (AXIM_ERR): 当 GICSS 接收到总线事务错误(如解码错误或保护错误)时,触发此中断。这是一个高电平脉冲中断,如果发生此错误,可能导致 GICSS 丢失中断,必须复位。
- ECC 错误中断 (ECC_FATAL): 当检测到 ITS 缓存内存中的不可纠正的双比特错误时,触发此中断。如果发生此错误,同样需要复位。
GICSS 中的 ECC(纠错码)支持
GICSS 内部的 Arm GIC-500 使用 SECDED ECC(单错误纠正,双错误检测)技术来保护内存不受数据错误的影响。GICSS 内部还集成了 ECC 聚合器 (ECC Aggregator) ,允许在测试中注入错误以验证系统的容错能力。通过对不同内存模块(如 ICB RAM、LPI RAM、VBUSM2AXI 桥等)的 ECC 管理,可以确保系统在运行中的数据完整性。
GICSS 寄存器
GICSS 寄存器分为多个区域,用于控制不同的功能:
- GICD_ 和 GITS_ 寄存器:用于访问 GICSS 的常规控制和 ITS 的翻译服务。
- GICSS0_ECC_AGGR 寄存器: 用于管理 ECC 聚合器的操作,包括注入错误、状态监控和中断使能等。
Vectored Interrupt Controller
ARM R5 核的中断控制器使用的是 Vectored Interrupt Controller PL192。VIC 比较简单,在此简单介绍。
Vectored Interrupt Controller PL192 是一个符合 AMBA(Advanced Microcontroller Bus Architecture) 标准的中断控制器,主要用于 SoC(System-on-Chip)设计中。它为 ARM 系列处理器提供了高效的中断管理接口,特别是对矢量化中断的支持能够有效降低中断处理延迟。
中断延迟的改进:
- 将中断控制器连接到 AMBA AHB 总线上,使得中断信号传输的速度更快。
- 提供矢量化的中断支持,使得在中断发生时,不需要软件判断中断源,硬件直接提供中断服务例程(ISR)的地址。
主要特性:
- 符合 AMBA 2.0 规范,便于集成到 SoC 设计中。
- 支持 32 个矢量化 IRQ 中断,并且可以同时生成 IRQ 和 FIQ。
- 硬件和软件的中断优先级管理,可根据需求灵活配置不同的中断优先级。
- 软件可编程的中断屏蔽:可以屏蔽特定优先级的中断,确保在处理中高优先级中断时,低优先级的中断不会打断处理流程。
- FIQ 与 IRQ 的支持:FIQ 用于快速中断请求处理,IRQ 用于处理常规中断,能够减少中断延迟。
中断请求和处理
中断请求逻辑
中断类型:
- FIQ(Fast Interrupt Request) :用于快速处理,具有最高优先级,处理器可以直接执行 ISR,而不需要判断中断源,从而减少上下文切换,降低延迟。
- IRQ(Interrupt Request) :用于常规中断处理。系统中可以有多个 IRQ,VIC 会根据中断的优先级和硬件配置决定哪个中断优先被处理。
PrimeCell VIC 通过中断请求逻辑模块接收来自外设的中断请求,并根据中断优先级、屏蔽配置以及是否激活等条件决定是否发出 IRQ 或 FIQ 信号。该模块允许将特定的中断源通过软件控制设为软中断,并可以屏蔽某些低优先级的中断。
非矢量化 FIQ 中断逻辑会根据 FIQ 请求生成 FIQ 中断信号,并结合菊花链模式下的其他中断控制器请求处理。由于 FIQ 的优先级最高,通常在系统中只启用一个 FIQ 中断源以保证低延迟。
矢量化 IRQ 中断逻辑提供 32 个矢量化的中断块,每个块对应一个 IRQ 中断源。当中断源被激活且优先级未被屏蔽时,系统会根据该源的优先级提供 ISR 地址,并将当前中断服务标志写入 VICADDRESS 寄存器。
中断优先级逻辑
中断优先级通过两种方式进行管理:
- 软件编程的优先级:通过编程的方式,可以动态改变中断源的优先级。
- 硬件固定优先级:在同级别的多个中断同时发生时,系统会按照硬件固定的优先级顺序处理中断(中断 0 具有最高优先级,菊花链中断具有最低优先级)。
中断优先级屏蔽
VIC 提供了两种中断优先级屏蔽方式:
- 硬件屏蔽:当某个中断正在被服务时,同级或低级中断将被屏蔽,直到服务完成。
- 软件屏蔽:通过 VICSWPRIORITYMASK 寄存器可以实现对特定优先级的持续屏蔽,不受中断服务状态的影响。
中断处理流程
在中断处理流程中,当一个中断发生时,CPU 首先会读取中断服务程序的地址,然后执行相应的中断服务例程(ISR)。在 ISR 结束时,必须清除中断请求,以便处理下一个中断。
- 中断发生。
- 处理器跳转到中断向量。
- 读取 VICADDRESS 寄存器,获取 ISR 地址。
- 执行 ISR。
- 清除中断请求。
- 恢复处理器状态。
编程模型
这一章节详细描述了 PrimeCell VIC 的编程接口,包含多个关键寄存器,用于控制中断的启用、状态检查、服务地址设置等。
PrimeCell VIC 寄存器
关键寄存器:
- VICIRQSTATUS:读取当前活动的 IRQ 中断状态。
- VICFIQSTATUS:读取当前活动的 FIQ 中断状态。
- VICRAWINTR:读取原始中断状态,反映哪些中断源被触发。
- VICINTENABLE:控制是否启用某个中断源。
- VICVECTADDR0-VICVECTADDR31:用于存储 32 个中断源对应的中断服务例程(ISR)地址。
- VICSWPRIORITYMASK:软件控制的中断优先级屏蔽寄存器,用于屏蔽特定优先级以下的中断。
中断延迟
中断延迟是衡量中断系统性能的关键指标之一。延迟主要取决于中断源的优先级、处理器响应时间以及系统时钟等因素。为了减少延迟,VIC 允许在中断服务过程中嵌套更高优先级的中断。
菊花链模式
菊花链模式是 VIC 提供的一个扩展功能,通过多个中断控制器的级联,可以支持更多的中断源。但是,使用菊花链模式会增加中断延迟,因此需要根据应用场景慎重选择。
菊花链中断控制器连接
在菊花链模式下,VIC0(靠近处理器的 VIC)负责阻止来自下一级 VIC(例如 VIC1)的低优先级中断。VIC1 的中断信号会传递给 VIC0,并由 VIC0 决定是否向处理器发出中断请求。
中断源
GICSS0 中断映射(Reference 表 9-59 和 9-60)
GICSS(Global Interrupt Controller Subsystem,全球中断控制子系统)用于管理和路由来自外围设备和系统模块的中断信号到处理器核心。每个核心都有自己独立的 PPI 事件映射,而 SPI 则是多个核心间共享的。
2.1 GICSS0 PPI 中断映射(Reference 表 9-59)
GICSS0 的 PPI 中断线负责为每个 A53 核心提供 16 个事件(事件编号为 16 到 31),这些中断线可配置为低电平触发(默认)或高脉冲触发。这种灵活性允许处理器根据不同场景选择适合的中断模式。
以下是 A53 核心的 PPI 事件映射:
- GICSS0_PPI0_0_IN_22 (中断 ID: 22): 对应 COMMIRQ0_0,这是通信相关的中断信号,可能用于核心之间的通信任务。
- GICSS0_PPI0_0_IN_23 (中断 ID: 23): 对应 PMUIRQ0_0,代表性能监控单元(Performance Monitoring Unit,PMU)中断,用于监控和优化处理器性能。
- GICSS0_PPI0_0_IN_26 (中断 ID: 26): 对应 CNTHPIRQ0_0,这是一个计时器中断,用于处理高优先级的系统定时任务。
这些事件为处理器核心提供了独立的硬件中断处理能力,确保处理器能够实时响应特定的硬件事件。
2.2 GICSS0 SPI 中断映射(Reference 表 9-60)
SPI 中断(Shared Peripheral Interrupt)与 PPI 不同,SPI 可以被配置为触发一个或多个处理器核心。它可以处理大量外部设备的中断请求,事件编号从 32 到 256 不等。每个中断输入线可以通过软件进行配置,既支持电平触发,也支持脉冲触发,具体取决于设备和系统的需求。
例如:
- GICSS0_SPI_IN_32 (中断 ID: 32): 对应
MAIN_GPIOMUX_INTROUTER0_OUTP_0
,这是一个 GPIO 多路复用器的中断,用于处理来自 GPIO 端口的信号。 - GICSS0_SPI_IN_64 (中断 ID: 64): 对应
DMASS0_INTAGGR_0_INTAGGR_VINTR_PEND_0
,该中断是 DMA 子系统(DMASS)中断聚合器产生的虚拟中断,用于管理 DMA 数据传输过程中的事件。
这些 SPI 中断的映射确保系统能够有效处理大量外部设备的中断请求,特别是在多任务、多设备通信的嵌入式系统中。
3. R5FSS 中断映射(Reference 详见表 9-61 和 9-62)
R5FSS(R5 Subsystem,R5 子系统)中的核心主要用于实时任务的处理,它们有自己专属的中断控制器 VIM(Vectored Interrupt Manager)。文档中详细列出了 R5FSS 核心的中断映射表,其中包含了两个核心的映射(R5FSS0_CORE0 和 R5FSS0_CORE1)。
3.1 R5FSS0_CORE0 中断映射(Reference 表 9-61)
R5FSS0_CORE0 的中断映射表(表 9-61)详细描述了每个中断输入线的来源。例如:
- R5FSS0_CORE0_INTR_IN_0 (中断 ID: 0): 对应
RTI8_INTR_WWD_0
,这是一个看门狗定时器(Watchdog Timer,WWD)中断,常用于监控系统是否卡住或运行异常,一旦系统长时间未响应,它可以触发中断,要求处理器执行重置或其他恢复操作。 - R5FSS0_CORE0_INTR_IN_16 (中断 ID: 16): 对应
FSIRX0_FSI_RX_OINT1_0
,这是 FSI(Fast Serial Interface)的接收中断,用于处理高速串行接口上的数据接收事件。
3.2 R5FSS0_CORE1 中断映射(Reference 表 9-62)
R5FSS0_CORE1 的中断映射与 CORE0 类似,它也支持多种外设和子系统的中断处理。例如:
- R5FSS0_CORE1_INTR_IN_9 (中断 ID: 9): 对应
DMASS0_INTAGGR_0_INTAGGR_VINTR_PEND_81
,这是 DMA 中断聚合器的虚拟中断,主要处理 DMA 数据传输过程中的中断事件。 - R5FSS0_CORE1_INTR_IN_108 (中断 ID: 108): 对应
EPWM0_EPWM_ETINT_0
,用于处理脉宽调制(PWM)单元产生的外部事件中断,常用于控制电机或其他需要精确控制的设备。
示例
AM243x 中断相关的 API 使用非常直观:
- 初始化相关参数,包括中断号、中断服务函数(回调),传递给中断服务函数的参数、优先级等。
- 创建一个中断相关的对象,
HwiP_construct
会完成中断服务函数的注册和相关中断的使能。
void myISR(void *args)
{
/* my ISR */
}
HwiP_Params hwiParams;
HwiP_Object hwiObj;
HwiP_Params_init(&hwiParams);
/* for R5F, interrupt #10 at VIM */
hwiParams.intNum = 10;
/* for M4F, external interrupt #10 at NVIC is
16 internal interrupts + external interrupt number at NVIC
i.e hwiParams.intNum = 16 + 10;
*/
hwiParams.callback = myISR;
hwiParams.args = NULL;
HwiP_construct(&hwiObj, &hwiParams);
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于