AM243x 中断

AM243x 集成了多个中断控制器,负责管理和分发跨不同核心和子系统的中断事件:

  1. 安全通道或通用微控制器单元(MCU_M4FSS)

    • 基于单核的 Cortex-M4F 处理器
    • 集成嵌套向量中断控制器(NVIC)
  2. 微处理器单元(A53SS0)

    • 双核 A53 集群
    • SoC 级通用中断控制器(GICSS0),支持双 A53 核心
  3. 实时微控制器单元(R5FSS0,R5FSS1)

    • 双核 R5F 集群
    • 向量化中断管理器(VIM)
  4. 工业通信子系统(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 中实现了 AXI2VBUSMVBUSM2AXI 桥接模块,用于系统不同总线之间的协议转换:

  • 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 RAMLPI RAMVBUSM2AXI 桥等)的 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 系列处理器提供了高效的中断管理接口,特别是对矢量化中断的支持能够有效降低中断处理延迟。

中断延迟的改进:

  1. 将中断控制器连接到 AMBA AHB 总线上,使得中断信号传输的速度更快。
  2. 提供矢量化的中断支持,使得在中断发生时,不需要软件判断中断源,硬件直接提供中断服务例程(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 寄存器。

中断优先级逻辑

中断优先级通过两种方式进行管理:

  1. 软件编程的优先级:通过编程的方式,可以动态改变中断源的优先级。
  2. 硬件固定优先级:在同级别的多个中断同时发生时,系统会按照硬件固定的优先级顺序处理中断(中断 0 具有最高优先级,菊花链中断具有最低优先级)。

中断优先级屏蔽

VIC 提供了两种中断优先级屏蔽方式:

  1. 硬件屏蔽:当某个中断正在被服务时,同级或低级中断将被屏蔽,直到服务完成。
  2. 软件屏蔽:通过 VICSWPRIORITYMASK 寄存器可以实现对特定优先级的持续屏蔽,不受中断服务状态的影响。

中断处理流程

在中断处理流程中,当一个中断发生时,CPU 首先会读取中断服务程序的地址,然后执行相应的中断服务例程(ISR)。在 ISR 结束时,必须清除中断请求,以便处理下一个中断。

  1. 中断发生。
  2. 处理器跳转到中断向量。
  3. 读取 VICADDRESS 寄存器,获取 ISR 地址。
  4. 执行 ISR。
  5. 清除中断请求。
  6. 恢复处理器状态。

编程模型

这一章节详细描述了 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 使用非常直观:

  1. 初始化相关参数,包括中断号、中断服务函数(回调),传递给中断服务函数的参数、优先级等。
  2. 创建一个中断相关的对象,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);

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...