各类中断控制器异同比较总结
0. 总结
本文是AI加拼夕夕拼出来的,肯定一堆问题,有问题请指出我去修改
关键要素
广义的中断概念主要包括以下几个关键要素:
-
中断源:中断可以由多种来源引起,包括外部设备(如输入设备、传感器、外部信号)、定时器、错误检测等。
-
中断请求(IRQ):当中断源检测到需要处理的事件时,它会向处理器发送中断请求。这个请求告诉处理器有事件需要中断当前的执行流程来处理。
-
中断服务程序(ISR):中断请求被处理器接受后,会转向执行中断服务程序,通常是一个预定义的函数。ISR处理特定的中断事件。
-
中断响应与上下文切换:处理器在响应中断时,需要保存当前程序的执行状态(即上下文),并加载中断处理程序所需的上下文。这种上下文切换是中断机制的关键之一,确保中断处理后可以恢复正常程序的执行。
-
中断优先级:在多种中断源的情况下,处理器可能需要根据中断的优先级来决定哪个中断应该先被响应。通常,高优先级的中断会抢占低优先级的中断。
-
中断嵌套:一些系统支持中断嵌套,即在处理一个中断时,如果有更高优先级的中断发生,当前的中断可以被挂起,等高优先级中断处理完后再继续执行。
-
中断屏蔽和使能:处理器可以通过中断屏蔽来禁用或使能特定的中断。这通常用于在某些操作期间防止中断干扰,或在特定条件下启用中断。
-
中断返回:中断服务程序处理完毕后,处理器需要返回到中断前的程序执行状态,继续执行被中断的任务。这通常通过恢复保存的上下文来实现。
本文目标是从这些角度学习一个架构的中断,比较他们的异同
1. Cortex-M Nested Vectored Interrupt Controller(NVIC)
-
中断源:NVIC 支持多达 240 个外部中断源,具体数量取决于不同的 Cortex-M 处理器型号。可以软件挂起中断。
-
中断请求(IRQ):每个中断源都有一个唯一的中断请求号(IRQn),用于标识特定的中断源。
当外设发生事件时,会向 NVIC 发送中断请求。 -
中断服务程序(ISR):每个中断源都有一个对应的中断服务程序(ISR),用于处理中断事件。
ISR 的地址存储在中断向量表中,NVIC 会根据中断请求号跳转到相应的 ISR。 -
中断响应与上下文切换:当 NVIC 接收到中断请求时,会根据中断优先级决定是否响应。
如果当前没有更高优先级的中断正在执行,NVIC 会触发中断响应,保存当前上下文,并跳转到相应的 ISR。
在 ISR 执行完毕后,会恢复之前的上下文,继续执行被中断的代码。这里的上下文切换时是硬件保存上下文环境的。 -
中断优先级:NVIC 支持中断优先级管理。
优先级通过NVIC_IPR
寄存器进行配置,数值越小,优先级越高。
中断有两类优先级:抢占优先级和响应优先级。
抢占优先级决定了是否允许中断被其他高优先级中断打断,而响应优先级则决定了中断的处理顺序。 -
中断嵌套:NVIC 支持中断嵌套机制,即高优先级的中断可以打断低优先级的中断。
这使得系统能够及时响应紧急事件,满足实时性要求。 -
中断屏蔽和使能:NVIC 提供了中断使能和屏蔽功能。
可以通过NVIC_ISER
和NVIC_ICER
寄存器来启用和禁用中断。
此外,BASEPRI
寄存器可以设置全局中断屏蔽阈值,只有优先级高于该阈值的中断才能被响应。 -
中断返回:在 ISR 执行完毕后,处理器会通过特定的指令(如
BX LR
)返回到中断前的执行状态,恢复上下文,继续执行被中断的代码。这里的恢复上下文也是硬件过程。
1.1 NVIC 概述
NVIC 是 ARM Cortex-M 系列处理器的中断管理单元,专门用于中断优先级管理、中断仲裁以及中断嵌套控制。它与 ARMv7-M 和 ARMv8-M 架构的异常处理机制紧密集成,特别适用于低功耗、单核嵌入式设备和实时操作系统(RTOS)环境。NVIC 提供了灵活的中断管理功能,使得 Cortex-M 处理器在实时性要求高的应用中表现优异。
1.2 主要特点
- 外部中断支持:支持 1 至 240 个外部中断,具体数量根据不同的 Cortex-M 处理器型号而有所不同。
- 中断嵌套:支持高优先级中断抢占低优先级中断,从而实现实时性要求。中断处理可以打断其他正在执行的中断服务程序(ISR),确保重要任务能及时响应。
- 动态优先级调整:通过 8-bit 寄存器存储中断优先级,实际使用的位数依据具体的 Cortex-M 型号而定(如 Cortex-M0/M0+ 使用 2-bit,Cortex-M3/M4/M7 使用 3-bit 或 4-bit)。
- 向量中断:通过中断向量表直接跳转到相应的中断服务程序(ISR),极大地减少了中断响应的延迟。
- 低功耗支持:支持通过 WFI(Wait For Interrupt)等模式,使处理器进入低功耗待机状态,并在中断发生时快速唤醒 CPU。
1.3 中断类型
- 系统异常(Processor Exceptions):由处理器内部产生的异常,如 Reset、NMI、HardFault、MemManage、BusFault、UsageFault 等。
- 外部中断(External Interrupts):由外部硬件触发的中断,典型例子包括 GPIO、UART、定时器等外设中断。
1.4 中断优先级管理
- 优先级设置:在 NVIC 中,中断优先级数值越小,优先级越高。优先级通过
NVIC_IPR
寄存器进行配置。中断有两类优先级:抢占优先级和响应优先级。抢占优先级决定了是否允许中断被其他高优先级中断打断,而响应优先级则决定了中断的处理顺序。 - 抢占机制:NVIC 支持中断嵌套和抢占,通过
BASEPRI
或PRIMASK
寄存器进行动态优先级控制。BASEPRI
设置了一个全局屏蔽阈值,当该值大于或等于当前处理中断的优先级时,中断被屏蔽。
1.5 补充说明
寄存器与编程示例
常用的 NVIC 寄存器包括:
NVIC_ISER
/NVIC_ICER
:用于启用和禁用中断。NVIC_ISPR
/NVIC_ICPR
:用于设置和清除中断挂起标志。NVIC_IPR
:用于配置中断的优先级。
每个中断的处理程序由中断向量表(Interrupt Vector Table, IVT)中的对应入口地址指向。系统通过向量表快速定位并跳转到相应的中断服务例程(ISR)。
// 示例中断向量表
void (* const interrupt_vector_table[])(void) __attribute__((section(".vectors"))) = {
Reset_Handler, // 复位中断
NMI_Handler, // 非屏蔽中断
HardFault_Handler, // 硬件故障
// 更多中断服务例程...
};
在实际应用中,系统通过中断向量表在中断发生时跳转到相应的 ISR。中断向量表通常位于系统内存的特定位置。
示例代码
// 设置中断优先级
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority);
// 启用中断
void NVIC_EnableIRQ(IRQn_Type IRQn);
void TIM2_IRQHandler(void)
{
// 自动压栈保存上下文
// 处理中断任务
// 清除中断挂起标志(视具体外设而定)
}
// 配置外部中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; // 抢占优先级 2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; // 子优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 启用外部中断通道
NVIC_Init(&NVIC_InitStructure);
// 外部中断 2 服务程序
void EXTI2_IRQHandler(void)
{
// 中断处理代码
}
嵌套中断机制
Cortex-M 的中断嵌套机制支持通过动态设置 BASEPRI
或 PRIMASK
来控制中断的嵌套。在 ISR 内部,可以允许更高优先级的中断打断当前的中断服务程序,从而实现中断嵌套。
例如,可以通过设置 BASEPRI
来限制当前可中断的中断优先级,进而允许更高优先级的中断进行处理。这种机制对于高实时性要求的应用非常重要,能够确保系统在关键时刻响应紧急事件。
2. Cortex-A/Cortex-R Generic Interrupt Controller(GIC)
(待补充)
ARM通用中断控制器(GIC)是ARM架构中用于管理中断的核心组件,负责协调多个中断源并确保高效处理。以下从八个角度详细解析GIC的功能和机制:
- 中断源
GIC支持三类中断源:
- SPI(Shared Peripheral Interrupt):全局外设中断,可路由到任意CPU核心,例如GPIO、网络控制器等。
- PPI(Private Peripheral Interrupt):每个CPU核心私有的中断,如本地定时器。
- SGI(Software Generated Interrupt):软件触发的中断,用于核间通信(IPC),例如多核同步。
中断源通过唯一ID(如GICv2中SGI 0-15,PPI 16-31,SPI 32-1019)标识,由Distributor模块统一管理。
- 中断请求
- 触发方式:中断可配置为电平触发(Level-sensitive)或边沿触发(Edge-triggered)。
- 状态管理:中断请求被标记为
Pending
状态,等待Distributor处理。若中断被屏蔽或CPU未响应,则保持Pending直至条件满足。
- 中断服务程序(ISR)
- 中断向量获取:CPU通过读取
GICC_IAR
寄存器获取中断ID,跳转到对应ISR。 - ISR执行:OS根据中断ID查询中断描述表(如Linux的
irq_desc
),执行注册的处理函数。 - 优先级与抢占:高优先级中断可抢占正在执行的ISR(若支持嵌套)。
注意此处是软件在做跳转,所以这里实际上是函数调用的过程,而不是NVIC里的自动保存中断上下文然后执行ISR。
NVIC的中断向量表要比GIC长得多,硬件的中断都是独立的,按我之前的理解,这也是实时性的保证,因为中断的响应完全依据硬件了。
- 中断响应与上下文切换
- 硬件自动保存:CPU响应中断时,自动保存PC、CPSR等核心寄存器到异常模式栈(如ARM的IRQ模式)。
- 上下文切换:OS可能进一步保存通用寄存器、浮点状态等,确保ISR结束后恢复现场。
- 低延迟优化:GICv3引入Affinity Routing,支持直接中断投递至目标CPU,减少延迟。
- 中断优先级
- 优先级配置:每个中断通过
GICD_IPRIORITYRn
寄存器分配优先级(数值越低优先级越高)。 - 仲裁机制:Distributor比较所有Pending中断的优先级,选择最高者发送至CPU Interface。
- 抢占策略:高优先级中断可抢占低优先级的活跃中断(需配置为可抢占模式)。
- 中断嵌套
- 嵌套条件:需满足两点:
- CPU全局中断使能(如ARM的
CPSR.I
位已开启)。 - 新中断优先级高于当前ISR的优先级。
- CPU全局中断使能(如ARM的
- 实现方式:ISR中需手动重新使能中断(如调用
sti
指令),GIC根据优先级动态裁决。
- 中断屏蔽和使能
- 全局控制:Distributor的
GICD_CTLR
寄存器控制全局中断使能。 - 单个中断屏蔽:通过
GICD_ISENABLERn
和GICD_ICENABLERn
寄存器使能/禁用特定中断。 - CPU接口屏蔽:每个CPU可通过
GICC_CTLR
独立屏蔽中断,或设置优先级过滤阈值(仅处理高于某优先级的中断)。
- 中断返回
- 结束中断(EOI):ISR完成后写入
GICC_EOIR
寄存器,通知GIC结束处理。GIC将中断状态从Active
转为Inactive
。 - 上下文恢复:CPU执行异常返回指令(如
ERET
),恢复之前保存的寄存器状态,继续执行原任务。
2.1 GIC 概述
Cortex-M 系列处理器采用 NVIC(Nested Vectored Interrupt Controller)作为中断控制器,而 Cortex-A 和 Cortex-R 系列处理器则使用 GIC(Generic Interrupt Controller)进行中断管理。GIC 是 ARM 为 Cortex-A 和 Cortex-R 内核设计的中断控制器,类似于 Cortex-M 中的 NVIC。GIC 目前有四个版本:V1、V2、V3 和 V4,其中 V1 版本已经被废弃,而 V2 至 V4 仍然广泛使用。
- GIC V2:支持 ARMv7-A 架构(如 Cortex-A7、A9、A15 等)。
- GIC V3 和 V4:针对 ARMv8-A/R 架构设计,支持 64 位处理器,并引入了许多新特性,如 Redistributor 和 LPI(Locality-specific Peripheral Interrupts)。
GIC 的核心功能是处理中断的路由、优先级和仲裁,尤其适用于多核系统,它能够管理不同 CPU 核心间的中断分配,实现高效的中断处理。
2.2 版本及其演进
- GICv1:最初版本,支持最多 8 核的系统。由于功能相对简单,现已不再使用。
- GICv2:引入了硬件优先级支持,最多支持 32 核,广泛应用于中小规模多核系统。
- GICv3:支持多达 128 核,并引入了 Redistributor 和 LPI,适用于大规模多核系统。
- GICv4:主要面向虚拟化环境,支持 Direct Injection 技术,显著提升虚拟机中的中断处理效率。
2.3 中断类型
在 ARM 架构中,中断是分优先级进行管理的。中断优先级的管理使得多个设备能同时触发中断,处理器必须根据优先级来决定先响应哪个中断。中断的状态可以分为四种:
- inactive:中断处于无效状态,尚未被触发。
- pending:中断处于有效状态,但 CPU 尚未响应。
- active:中断处于有效状态,CPU 正在处理中断。
- active and pending:CPU 正在处理中断,但同一中断源再次触发中断。
在 GIC 系统中,中断类型包括:
- PPI(Private Peripheral Interrupt):私有外设中断,仅针对特定 CPU 核有效,通常用于定时器等内部外设。
- SPI(Shared Peripheral Interrupt):共享外设中断,来自外部设备,可以被多个 CPU 核共享。
- SGI(Software Generated Interrupt):软件生成中断,用于跨 CPU 核进行通信。
- LPI(Locality-specific Peripheral Interrupt):特定局部外设中断,主要用于 GICv3 和更高版本,适用于大规模的中断管理。
2.4 中断优先级管理
GIC 的中断优先级由多个寄存器进行配置,通常采用 8-bit 编码方式(理论支持 256 级优先级,但实际使用时一般为 32 级)。每个中断的优先级由 GICD_IPRIORITYR
寄存器配置,同时 CPU 内部的优先级阈值可以通过 GICC_PMR
寄存器进行设置。
- 优先级编码:使用 8-bit 编码来定义中断优先级,但通常只有高 5 位(32 级)有效。优先级数值越小,优先级越高。
- 抢占机制:支持高优先级中断抢占低优先级中断,从而确保紧急任务能够迅速得到处理。(需要软件配合)
2.5 中断路由与虚拟化支持
GIC 提供了强大的中断路由功能,可以通过 GICD_ITARGETSR
等寄存器将中断分配到特定的 CPU 核,支持多核系统的负载均衡。此外,GICv3 和 GICv4 还增强了虚拟化支持,通过引入虚拟 CPU 接口(GICV)和 Hypervisor 控制接口(GICH),使得虚拟化环境中的中断处理更加高效。
- 中断路由:通过设置
GICD_ITARGETSR
等寄存器,可以将中断指向特定的 CPU 核。多核系统可以根据负载情况动态调整中断分配,以确保系统的高效运行。 - 虚拟化支持:GICv3 和 GICv4 提供了 Direct Injection 支持,减少虚拟化中的 VM-EXIT 次数,显著提升虚拟化环境中断处理的效率。
2.6 GIC 的高级功能
除了基本的中断管理,GIC 还支持一系列高级功能,用于提升多核系统的中断处理效率和灵活性:
-
中断屏蔽(Interrupt Masking):GIC 允许在特定条件下屏蔽某些中断,这对于实现任务调度、功耗管理和中断隔离等功能非常有用。例如,通过设置
GICC_PMR
寄存器,CPU 可以动态调整中断优先级阈值,控制哪些中断能打断当前的处理过程。 -
中断聚合(Interrupt Aggregation):在某些情况下,多个中断源会触发相同类型的中断,这时 GIC 可以进行中断聚合,将多个中断源合并为一个,减少中断处理的开销。例如,多个同一类型的外设中断可以被聚合成一个整体中断信号传递给处理器,处理器可以集中进行处理。
-
优先级的动态调整:GIC 支持在运行时调整中断优先级。例如,可以通过编程调整
GICD_IPRIORITYR
和GICC_PMR
来根据实时负载调整优先级,保证关键任务优先处理。这种动态调整能力特别适用于高实时性要求的系统。
2.7 中断的分配与路由
GIC 的中断路由功能支持细粒度的控制,允许不同类型的中断被动态地分配给不同的 CPU 核心,这为多核处理器提供了灵活的负载均衡机制。
-
多级中断路由:GIC 采用了两级中断路由机制,首先在
GICD
(Distributor)中进行中断分配,然后在每个核心的GICC
(CPU Interface)中处理中断。这种结构使得中断管理更加高效,也便于进行优化和扩展。 -
优先级与目标 CPU 核的关联:通过配置
GICD_ITARGETSR
寄存器,可以指定哪些 CPU 核应该响应哪些中断。例如,可以将某个关键外设的中断绑定到特定的 CPU 核,保证该核始终能优先处理高优先级的任务。 -
中断负载均衡:通过合理的中断路由策略,可以确保多核处理器系统中的中断处理负载平衡,避免某个核心过载而其他核心处于空闲状态。
2.8 虚拟化支持
GICv3 和 GICv4 在虚拟化方面引入了许多重要特性,使得它们在虚拟化环境中的中断处理更高效、灵活。特别是,虚拟化支持在数据中心、云计算平台和嵌入式系统中应用越来越广泛。
-
虚拟中断直通(Direct Injection):GICv3 和 GICv4 提供了对虚拟机的直接中断注入支持(Direct Injection)。这意味着虚拟机可以直接接收到物理中断,而不需要通过 hypervisor 的干预。这种机制减少了中断传递的延迟,提高了中断响应速度。
-
虚拟 CPU(vCPU)管理:在虚拟化环境中,GICv3 和 GICv4 允许为每个虚拟 CPU 分配独立的中断资源,并通过
GICV
(Virtual CPU Interface)和GICH
(Hypervisor Control Interface)进行管理。这使得虚拟机中的中断处理可以像物理机一样高效运行。 -
中断屏蔽与优先级隔离:通过虚拟化接口,GIC 还支持虚拟机之间的中断隔离。每个虚拟机可以有自己的中断优先级和屏蔽设置,不同虚拟机的中断不会相互干扰。这对于提升虚拟化环境的安全性和隔离性非常重要。
3. RISC-V 中断模型
-
中断源:RISC-V支持多种中断源,包括:
- 外部中断:由外部硬件设备触发,如外部传感器或外部总线错误。
- 软件中断:由软件指令触发,通常用于系统调用或进程间通信。
- 定时器中断:由定时器模块触发,用于实现时间片轮转等功能。
-
中断请求(IRQ):当中断源触发时,会向处理器发出中断请求。RISC-V通过控制状态寄存器(CSR)来管理中断请求。例如,
mip
寄存器用于表示机器模式下的中断挂起状态。 -
中断服务程序(ISR):中断服务程序是处理特定中断的函数或例程。RISC-V通过设置异常向量表(
mtvec
寄存器)来指定中断服务程序的入口地址。当中断发生时,处理器会跳转到相应的ISR进行处理。 -
中断响应与上下文切换:当中断发生时,处理器会保存当前的执行上下文(如程序计数器
pc
)到特权级寄存器(如mepc
),然后跳转到中断服务程序。ISR执行完毕后,处理器会恢复之前保存的上下文,继续执行被中断的任务。RISC-V通过mstatus
寄存器的MIE
和MPIE
位来控制中断的使能和嵌套。 -
中断优先级:RISC-V的标准中断控制器(如CLIC)支持为每个中断源设置优先级。当多个中断同时发生时,处理器会根据优先级决定哪个中断先被处理。优先级通常通过中断控制器的寄存器进行配置。
-
中断嵌套:RISC-V支持中断嵌套,即在处理中断时,允许更高优先级的中断打断当前的中断处理。这使得系统能够及时响应高优先级的事件。中断嵌套的管理由中断控制器的优先级和使能机制控制。
-
中断屏蔽和使能:RISC-V通过控制状态寄存器(CSR)来管理中断的使能和屏蔽。例如,
mie
寄存器用于控制机器模式下的中断使能,mstatus
寄存器的MIE
位用于全局中断使能。通过设置这些寄存器,操作系统可以动态地启用或禁用特定的中断源。 -
中断返回:在ISR执行完毕后,处理器需要恢复之前的上下文并返回到被中断的任务。RISC-V通过
mret
指令来实现从机器模式返回,sret
指令用于从监督模式返回,uret
指令用于从用户模式返回。这些指令会根据当前的特权级别,恢复相应的上下文并跳转到中断前的执行位置。
3.1 概述
RISC-V 的中断机制基于特权架构设计,支持 M-mode、S-mode 和 U-mode,不仅适用于嵌入式系统,也适合操作系统和多核处理器。中断与异常统称为“陷阱”。
3.2 中断类型
- 同步异常(Synchronous Exceptions):例如非法指令、访问错误、环境调用(ECall)等,由当前指令执行异常触发。
- 异步中断(Asynchronous Interrupts):例如软件中断、定时器中断和外部中断,由外部事件触发。
3.3 中断管理
- CLINT(Core Local Interruptor)
管理本地定时器和软件中断,关键寄存器包括:mtime
:64 位全局时间寄存器mtimecmp
:定时器比较值寄存器msip
:用于触发软件中断
- PLIC(Platform-Level Interrupt Controller)
处理外部中断,支持优先级仲裁和中断路由,通过编程配置中断使能、优先级和挂起状态。
3.4 中断优先级管理
- 特权级别管理:不同的特权级(M-mode、S-mode、U-mode)对应不同的中断处理权限。
- PLIC 优先级仲裁:为各外部中断设置可编程优先级,并将中断路由到合适的 CPU 核。
3.5 陷阱机制
- 陷阱入口:使用
mtvec
寄存器指定异常向量表地址。 - 上下文保存:
mepc
用于保存中断返回地址,mcause
存储异常原因,便于异常处理后返回正常执行。
3.6 RISC-V 中断和异常处理流程
在 RISC-V 架构中,异常和中断的处理通常被称为“陷阱(Trap)”,无论是同步异常(例如非法指令)还是异步中断(例如定时器中断),其处理流程大致是相似的。以下是 RISC-V 处理中断和异常的流程:
3.6.1 进入异常(Trap)
触发异常
当一个异常或中断发生时,CPU 会停止当前执行的指令流,并跳转到相应的异常处理程序。这个过程是通过 陷阱机制(Trap Mechanism)来实现的。在 RISC-V 中,异常和中断都会触发陷阱,进入异常处理流程。
跳转到异常入口
异常触发后,CPU 会根据 mtvec
寄存器的配置跳转到相应的异常处理入口。mtvec
寄存器是 机器模式异常入口基地址寄存器(Machine Trap-Vector Base-Address Register),它指定了异常处理程序的起始地址。
-
mtvec
的配置:mtvec
寄存器的低 2 位MODE
定义了异常的响应方式:MODE = 0
:处理器进入异常时,会直接跳转到mtvec
寄存器指定的固定地址。MODE = 1
:处理器会根据异常来源跳转到不同的地址。如果是 CPU 内部异常,则跳转到mtvec
指定的地址;如果是外部中断,则跳转到BASE + 4 * CAUSE
地址,其中CAUSE
是中断的编号。
通常情况下,
MODE = 1
用于更灵活地响应外部中断。
更新 CSR 寄存器
在进入异常处理之前,硬件会自动更新以下几个重要的 CSR(控制和状态寄存器):
mcause
(Machine Cause Register):记录异常或中断的原因(异常类型、外部中断等)。mepc
(Machine Exception Program Counter):保存当前异常发生时的 PC 值,即当前指令的地址。CPU 会跳转到异常处理程序时,mepc
会自动保存当前指令地址,以便之后从异常返回时继续执行。mtval
(Machine Trap Value Register):保存引发异常的相关信息,如存储器访问地址或非法指令编码。mstatus
(Machine Status Register):保存异常发生时的系统状态。mstatus
中的某些域会被硬件自动更新,如MIE
(机器中断使能)和MPP
(工作模式)。
3.6.2 执行异常服务程序(ISR)
根据异常类型执行相应的处理程序
根据 mcause
中的值,程序可以判断出异常的类型,并跳转到对应的异常处理程序。
mcause
寄存器的低位标志位 MCAUSE_INT 表示该异常是否为中断。如果是中断,mcause
中的 MCAUSE_CAUSE 字段会指示具体的中断类型。
处理中断或异常
对于每种异常,程序会根据 mcause
的值,进入不同的处理分支。你提供的代码示例在 handle_trap
函数中读取 mcause
和 epc
寄存器,然后根据不同的异常类型执行相应的操作。
uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc)
{
if (is_external_interrupt(mcause)) // 来自 PLIC 的外部中断
{
handle_m_ext_interrupt();
}
else if ((mcause & MCAUSE_INT) && (mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)
{
handle_m_time_interrupt(); // 来自定时器的中断
}
else
{
write(1, "trap\n", 5);
_exit(1 + mcause);
}
return epc;
}
注意:RISC-V 中规定,硬件不会自动保存和恢复上下文。因此,开发者需要手动保存和恢复上下文,以保证中断或异常处理程序的顺利执行。
保存和恢复上下文
由于 RISC-V 不会自动保存上下文,开发者需要在异常服务程序中明确保存当前任务的上下文(如寄存器值),并在异常处理结束后恢复上下文。
保存和恢复上下文通常使用如下步骤:
- 在进入异常时,保存当前的寄存器(包括程序计数器
epc
)。 - 在异常处理结束时,恢复被中断的程序状态,继续执行原程序。
3.6.3 退出异常
使用 MRET
指令退出异常
在异常处理完毕后,使用 MRET
指令从异常返回。MRET
指令会根据 mepc
中保存的地址恢复程序执行,跳转到异常发生前的地址,继续执行被中断的代码。
- 更新
mstatus
:MRET
指令执行时,会恢复异常前的状态,特别是MIE
(机器中断使能)和MPIE
(机器模式中断使能)域的值,从而恢复中断使能状态。
恢复中断状态
当从异常返回时,MIE
域的值会恢复为 MPIE
的值。MIE
控制全局中断的使能,如果 MPIE
为 1,表示异常前中断是开启的,恢复后中断继续开启;如果 MPIE
为 0,则中断会被关闭。
3.6.4 详细的异常处理示例
假设发生了一个外部中断,以下是处理该中断的步骤(无抢占):
- 外部设备(如外设或 GPIO)触发中断,RISC-V 内部生成异常并跳转到异常处理入口。
mtvec
指定的入口点会被加载。- 在进入异常时,硬件自动将当前的
PC
保存到mepc
,异常原因保存到mcause
,异常相关的地址或指令编码保存到mtval
。 - 异常处理程序根据
mcause
判断异常类型,并执行相应的处理程序。 - 处理中断后,使用
MRET
指令从异常返回,恢复上下文并恢复程序执行。
-
发生中断(抢占)时:
- CPU 硬件自动保存 mepc、mcause、mstatus 等基本信息。
- 中断服务程序(ISR)开始执行,软件保存其他通用寄存器(如 x0 到 x31)到栈中,确保当前上下文被正确保存。
-
处理中断A(低优先级):
- 假设中断A正在执行时发生了中断B(更高优先级)。
- 中断A的现场(包括通用寄存器等)被保存到栈中。
- 中断B的现场被保存到栈中。
-
处理中断B(高优先级):
- 中断B执行完毕后,现场被恢复,CPU 会返回到中断A的上下文。
-
退出中断时:
- 在 ISR 执行完毕后,软件恢复 mepc 和 mcause 等寄存器的内容,并使用 MRET 指令返回到中断前的程序。
- 如果有多个中断嵌套,软件会按照顺序恢复每个中断的现场,直到返回到最初的中断发生点。
4. 瑞萨 RH850 Interrupt Controller(INTC)
- 中断源:包括Reset、Debug exception、FE level non - maskable interrupt等多种类型,分为FE level和EI level中断。FE level有非掩码中断FENMI和掩码中断FEINT,EI level为掩码中断EIINT。这些中断源来自不同单元,如WDT、ECM、STM等。
- 中断请求(IRQ):通过特定引脚或内部事件触发,如外部引脚电平变化、定时器溢出等。不同中断源有不同触发条件,如FENMI在Secure WDT溢出时触发,EIINT可由外设模块事件触发。
- 中断服务程序(ISR):针对不同中断源有各自的处理程序。地址确定方式有直接向量法和表参考法,直接向量法根据PSW.EBV位、RBASE或EBASE寄存器及偏移确定;表参考法按特定公式计算地址。
- 中断响应与上下文切换:中断发生时,CPU检查条件并按优先级处理。FE-level和EI level中断分别保存PC、PSW等寄存器,更新PSW和MCTL,跳转到相应异常处理程序。处理完成后恢复上下文。
- 中断优先级:FENMI最高,其次是FEINT,EIINT最低。EIINT内部可通过EICn寄存器的P3n - P0n位设置16级优先级,优先级高的先处理,相同优先级则通道号低的优先。
- 中断嵌套:支持中断嵌套,高优先级中断可打断低优先级中断处理。处理时需注意保存和恢复EIPC、EIPSW寄存器,执行EI指令使能中断。
- 中断屏蔽和使能:EI level掩码中断可通过EICn.MKn位或IMRm寄存器相应位设置,1表示屏蔽,0表示使能。FE level掩码中断通过FEINTFMSKn寄存器设置。
- 中断返回:EI-level掩码中断用EIRET指令返回,FE-level掩码中断用FERET指令返回。返回时从相应寄存器加载PC和PSW,若满足条件更新ISPR寄存器。
中断控制器(Interrupt Controller,INTC)是RH850/P1x - C微控制器中的关键组件,主要负责管理和处理各类中断,确保系统能对不同事件做出及时响应,其主要特性和功能如下:
4.1 中断与异常管理
该微控制器支持多种异常类型,如Reset、Debug exception等。其中,部分异常被定义为中断,包括FE level non - maskable interrupt(FENMI)、FE level maskable interrupt(FEINT)和EI level maskable interrupt(EIINT)。FENMI即便在其他FE级中断服务中也能被响应,且不受 P S W . N P PSW.NP PSW.NP位影响,无法返回和恢复;FEINT在无其他FE级中断服务且 P S W . N P = 0 PSW.NP = 0 PSW.NP=0时可被响应 ,是除FENMI外优先级最高的中断;EIINT在无FE级中断服务且满足特定 P S W PSW PSW位条件时可被响应,具有16级中断优先级,可按通道进行中断屏蔽设置,且中断源可用于触发DMA等事件。
4.2 时钟供应
INTC1的操作时钟为CLK_CPU,INTC2的操作时钟为CLK_HSB。由于INTC2的时钟为CLK_HSB,连接到INTC2的INT32到INT255中断相比直接连接到INTC1的中断会有更多延迟。
4.3. 中断源及相关设置
- FE级非可屏蔽中断:以FENMI为例,由Secure WDT溢出触发,对应特定的控制寄存器、状态寄存器,无返回指令,不允许返回或恢复。
- FE级可屏蔽中断:FEINT有ECM、STM中断和终端NMI三个来源,映射到INTC1,需软件清除事件状态标志。通过FERET指令从中断处理程序返回,返回PC为挂起PC。
- EI级可屏蔽中断:共支持256个通道,通过INTC1和INTC2级联实现。每个中断通道对应特定的控制寄存器(如EICn),可设置中断触发条件、优先级等。通过EIRET指令从中断处理程序返回,返回PC为挂起PC。
4.4 中断控制寄存器
包含多种寄存器,用于控制和监控中断。如EICn用于设置EI级可屏蔽中断的控制条件;IMRm是EICn中MKn位的集合,用于整体屏蔽EI级可屏蔽中断;FNC、FIC分别指示FE级非可屏蔽中断和FE级可屏蔽中断的状态;FEINTFn等寄存器用于FEINT中断的事件状态、清除和屏蔽操作;EIBDn用于EI级中断源与PE的对应设置;SINTRn用于软件中断控制;IPIR_CHn用于PE间的中断通信。
4.5 中断操作相关功能
- 中断响应操作:当有中断发生时,会根据优先级检查是否满足响应条件,计算异常处理程序地址,保存相关寄存器值(如PC、PSW等),更新PSW和MCTL,然后跳转到异常处理程序。
- 中断返回:执行与中断级别对应的返回指令(EIRET或FERET),从相应寄存器(EIPC、EIPSW或FEPC、FEPSW)加载PC和PSW,恢复现场并返回执行。部分情况下,还需更新ISPR寄存器。
- 中断屏蔽与优先级:EI级可屏蔽中断可按通道屏蔽,通过设置EICn.MKn或IMRm.EIMKn实现。中断优先级分为FE级和EI级,FE级中FENMI > FEINT,EI级中可通过EICn的P3n - P0n位设置16级优先级,相同优先级的EIINTn中断,通道号小的优先。此外,还有优先级屏蔽功能,通过PMR寄存器实现对指定优先级EIINTn中断的批量禁止。
- 中断源选择与管理:FEINT中断有特定的源选择机制,通过相关状态标志寄存器、事件掩码寄存器和事件清除寄存器管理。同时,系统提供中断管理功能,可检查挂起的中断。
4.6 异常处理程序地址
确定方式有直接向量法和表参考法。直接向量法通过PSW.EBV位选择RBASE或EBASE寄存器作为基地址,加上对应偏移得到异常处理程序地址;表参考法根据中断控制器设置,在满足特定条件时,通过INTBP寄存器和通道号计算地址,从内存表中读取异常处理程序地址。
MCAL包使用的是表参考法,这种方法为类似ARM的中断向量表.
4.7 广播通知功能
每个中断可通过设置EIBD.CST和EIBDn.PEID[2:0]分配给特定PE,也可通过设置EIBDn.CST为1开启广播功能,由所有处理器元素处理。广播中断使用INTC1的特定中断输入,且有相应的优先级和屏蔽规则。 (待确认)
4.8 中断延迟
中断延迟指从INTC模块中断触发到中断处理程序中第一条指令执行的响应时间,其数值因设备、指令缓存状态、中断检测方式、异常处理程序寻址方法及地址参考表位置而异。
5. 英飞凌 Tricore Interrupt Router(IR)
- 中断源:包括外部资源、内部资源以及软件触发。外部中断通过特定的服务请求节点(SRN)连接到中断路由器模块,内部资源如各个模块产生的服务请求也连接至相应SRN,软件则可通过设置SRN的控制寄存器来触发中断。
- 中断请求(IRQ):在该系统中被称为服务请求,可由CPU或DMA模块处理。每个服务请求都有对应的SRN,SRN包含控制寄存器(SRC),用于配置请求的优先级、目标服务提供商等信息。服务请求可由硬件触发,也可通过软件对SRC寄存器的相关位进行操作来触发。
- 中断服务程序(ISR):与服务请求优先级编号相关联,CPU的中断向量表按优先级编号排序,不同优先级的服务请求可对应不同的ISR。这样同一外设能因不同目的设置多个优先级。当CPU响应中断时,根据中断优先级编号和基中断向量表指针计算中断向量表入口地址,进而找到对应的ISR进行处理。
- 中断响应与上下文切换:当有中断请求时,中断路由器模块的中断控制单元(ICU)进行仲裁,确定最高优先级的请求并提供给服务提供商。服务提供商开始执行请求时,向ICU发送确认信息,同时ICU将不再提供仲裁赢家,确保已确认的请求不会再次被提供。在中断响应过程中,可能涉及上下文切换,保存当前任务的状态,以便中断处理完成后恢复。
- 中断优先级:通过8位的服务请求优先级编号(SRPN)表示,每个活跃的中断源选择同一服务提供商时,SRPN值必须唯一以区分优先级。不同服务提供商对SRPN的使用规则不同,如CPU中0000H不能用于映射到CPU的服务请求,DMA则根据SRPN的最低有效位触发相应通道。
- 中断嵌套:当一个中断正在被处理时,如果有更高优先级的中断请求到来,且中断系统允许嵌套,那么高优先级中断可以打断当前中断处理,转而执行高优先级中断的服务程序。处理完高优先级中断后,再返回继续处理原来的中断,这一过程依赖于中断优先级的判断和中断控制逻辑。
- 中断屏蔽和使能:通过SRC寄存器中的SRE位控制中断的使能和屏蔽。SRE = 1时,中断请求参与仲裁,硬件在服务请求被确认时自动清除SRR位;SRE = 0时,中断请求不参与仲裁,软件可通过轮询SRR位检查请求,并通过写CLRR位来确认请求。
- 中断返回:当中断服务程序执行完毕后,使用特定的指令(如asm(“rfe”);)从事件中返回,恢复被中断的任务的执行。返回时会恢复之前保存的上下文信息,确保任务能继续正常执行。
5.1 简介
英飞凌 TC21x/TC22x/TC23x 系列微控制器中断路由 (IR) 模块, 该系统负责将来自外部资源、内部资源和软件的中断请求(服务请求)调度到 CPU 和 DMA 模块。
5.2 中断系统概述
- 目的:IR 模块将中断请求从外部资源、内部资源和软件调度到 CPU 和 DMA 模块。
- 组件:IR 包括服务请求节点 (SRN)、中断控制单元 (ICU) 和额外的软件开发支持功能。
- 操作:每个能够生成服务请求的模块都连接到 IR 中的一个或多个 SRN。每个 SRN 包含一个服务请求控制寄存器 (SRC),用于配置优先级和映射到服务提供商 (CPU 或 DMA)。
5.3 中断系统的特性
- 服务请求:支持多达 512/1024 个服务请求。
- 优先级级别:每个 ICU/服务提供商支持多达 255 个优先级级别。
- ICU:每个服务提供商最多支持 16 个 ICU,每个 CPU 和 DMA 模块都有专用的 ICU。
- 延迟:仲裁延迟低,从接收到服务请求到将其发送到服务提供商通常只需 3 到 4 个时钟周期。
- SRN:每个 SRN 都有一个可编程的 8 位优先级向量,并且可以映射到一个实现的 ICU/服务提供商。
- ECC:使用 ECC(错误检测和校正代码)进行完整性检查。
5.4 服务请求节点 (SRN)
服务请求节点(SRN)是TC21x/TC22x/TC23x系列芯片中断路由器模块的关键组成部分,负责处理和管理中断请求,确保系统能高效响应各类事件。
- 基本概念与功能:SRN是中断系统中连接外部触发单元与内部仲裁总线的桥梁,每个可产生服务请求的模块都与一个或多个SRN相连,同时还有通用SRN用于软件触发服务请求。每个SRN都包含一个服务请求控制寄存器(SRC) ,用于配置服务请求的优先级、目标服务提供商(CPU或DMA模块)等参数。
- SRC寄存器详解
- 寄存器位功能:SRC寄存器包含多种控制和状态位。如使能/禁用位SRE,用于决定服务请求是否参与仲裁;请求设置位SETR和清除位CLRR,可软件控制服务请求标志位SRR;8位优先级向量SRPN,用于确定服务请求优先级;服务类型控制位TOS,选择服务请求的目标服务提供商。
- ECC编码:ECC位字段用于错误检测,在对SRC寄存器特定写操作时更新。当SRN的服务请求被选中处理时进行ECC校验,检测到错误会报告给安全监控单元(SMU) ,但当前仅用于检测,不进行纠错。
- SRN配置与操作
- 默认状态与启用:所有SRN默认禁用,使用时需通过设置SRC.SRE位为1来启用,并进行相关配置。
- 配置更改:更改SRN配置(如TOS和SRPN)时,需遵循特定顺序,先禁用SRN,检查相关寄存器状态,再进行更改,最后重新启用,以避免中断丢失。
- 保护机制:SRC寄存器通过片上总线主TAG - ID保护,由ACCEN10和ACCEN00控制写访问。违反访问保护会根据情况处理,如部分更新或发送警报至SMU。
- 与其他组件关系
- 与ICU的连接:每个SRN连接到所有中断控制单元(ICU),其控制寄存器设置决定请求的目标ICU和优先级。ICU负责处理来自多个SRN的竞争请求,并进行仲裁。
- 与服务提供商的交互:SRN的服务请求经ICU仲裁后,由服务提供商(CPU或DMA模块)处理。服务提供商处理完请求后,会向ICU发送确认信息,ICU据此管理SRN状态。
5.5 中断控制单元 (ICU)
中断控制单元(ICU)是TC21x/TC22x/TC23x系列芯片中断路由器模块的重要组成部分,负责管理和仲裁中断请求,确保服务请求能有序地被服务提供商处理。
- ICU的基本架构与连接:每个服务提供商(CPU和DMA模块)都有与之对应的ICU,在整个中断系统中,最多可支持16个ICU 。SRN通过SRCx.TOS寄存器位字段映射到不同的ICU,从而实现服务请求的定向传递。
- ICU的主要功能
- 仲裁服务请求:负责管理来自多个SRN且映射到该ICU的竞争服务请求,通过仲裁机制确定哪个请求具有最高优先级,并将其提供给对应的服务提供商。
- 信息交互与处理:接收服务提供商关于已接受服务请求的信息,包括服务请求的优先级编号(SRPN)、错误校验码(ECC)以及服务请求节点索引(SRN Index)等。同时,对这些信息进行ECC检查,若发现错误,会将错误信号发送给安全监控单元(SMU) ,并管理相关SRN中已确认服务请求的清除工作。
- ICU的控制寄存器
- 最新获胜服务请求寄存器(LWSR):提供上一次仲裁获胜的服务请求信息,包括优先级编号(PN)、ECC字段(ECC)以及获胜SRN的ID 。其STAT位用于指示这些信息是否有效,当有来自对应SRN的中断未处理时,信息有效。
- 最后确认服务请求寄存器(LASR):记录服务提供商最后确认处理的服务请求信息,包含请求的优先级编号、ECC值以及对应的SRN ID。
- 错误捕获寄存器(ECR):在ICU检测到ECC错误时,捕获LASR寄存器的内容。软件可通过写入操作清除该寄存器内容,其中的STAT位表示是否检测到ECC错误,EOV位用于指示是否发生错误溢出情况。
- ICU在仲裁过程中的作用:在仲裁过程中,ICU根据SRN的SRC.SRPN位字段确定服务请求的优先级。若仲裁总线为共享总线,仲裁过程可能采用轮询方式为相关ICU服务。当确定获胜的服务请求后,ICU将其相关信息提供给服务提供商,并在收到服务提供商的确认信息后进行ECC检查,确保信息的准确性。
5.6 通用服务请求 (GPSR) 和服务请求广播寄存器 (SRB)
通用服务请求(GPSR)和服务请求广播寄存器(SRB)是TC21x/TC22x/TC23x系列芯片中断路由器模块中用于软件触发中断的重要机制,它们为软件灵活控制中断提供了便利。
- 通用服务请求(GPSR)
- 定义与功能:GPSR是中断路由器模块提供的一组可作为软件中断的服务请求,每个CPU都有多个通用服务请求组 ,每组包含四个服务请求节点(SRC_GPSRxy,x为组号,y为组内中断编号,y=0 - 3)。这些节点不与内部或外部硬件触发信号相连,仅能由软件触发,可用于实现软件自定义的中断功能。
- 触发与控制:通过相关的服务请求控制寄存器SRC_GPSRxy进行配置和控制。可通过写SRC_GPSRxy.SETR位为1或写对应的服务请求广播寄存器位SRBx[y]为1来触发相应的服务请求。
- 服务请求广播寄存器(SRB)
- 定义与功能:每个通用服务请求组(GPSRxy)都有一个对应的服务请求广播寄存器SRBx ,用于并行触发组内的多个服务请求。这一机制方便了软件一次性触发多个相关的软件中断。
- 操作特点:SRBx总是读为0,向SRBx[y]写入1可以触发GPSRxy服务请求(y=0 - 3) ,而向SRBx[31:4]写入1则不会产生任何效果。
5.7 系统寄存器
System Registers即系统寄存器,是TC21x/TC22x/TC23x系列芯片中断路由器模块的重要组成部分,涵盖多种不同功能的寄存器,用于实现对中断路由器模块的全面控制和管理。
- 寄存器访问保护(ACCEN1/0):基于主TAG ID对中断路由器控制寄存器进行写访问保护,是AURIX安全概念的一部分。每个具有总线主能力的片上资源都有唯一的主TAG ID。通过INT_ACCEN1和INT_ACCEN0寄存器控制写访问,每个位对应一个6位片上主TAG ID编码。SRC寄存器受其保护,违反访问保护会根据情况处理,如部分更新或向SMU发送警报。
- 内核复位寄存器(KRST1/0,KRSTCLR):中断路由器模块不包含这些寄存器,也不支持模块内核复位功能。这意味着该模块无法通过这些寄存器进行内核复位操作。
- 时钟控制寄存器(CLC):中断路由器模块没有时钟控制寄存器(CLC),不支持其相关功能,即无法通过CLC寄存器禁用该模块时钟,模块始终保持运行状态。
- OCDS控制和状态寄存器(OCS):中断路由器模块不包含OCDS控制和状态(OCS)寄存器,不支持其功能,该模块与OCS寄存器相关的操作均不可用。
5.8 仲裁过程
- 仲裁:在仲裁过程中,仲裁总线会比较所有待处理服务请求节点(通过 SRC.TOS 设置映射)的 SRC.SRPN 位字段,以确定优先级最高的请求。仲裁结束后,优先级最高的服务请求被确定为获胜者,其相关的 SRN 服务请求控制寄存器中的 SRPN、ECC 和 SRN 索引等信息会被提供给 ICU,ICU 再将这些信息传递给服务提供商。服务提供商处理完请求后,会向 ICU 发送确认信息,ICU 接收到后会进行 ECC 检查。
- ECC 检查:ICU 对从服务提供商接收到的信息执行 ECC 检查,并将错误信号发送到安全监控单元 (SMU)。
5.9 中断系统的使用
- CPU与ICU的接口:每个CPU都有一个接口连接到中断路由器模块的一个ICU。CPU与ICU的接口包含一组寄存器,用于接收ICU提供的服务请求信息(SRPN、SRN索引、ECC)。当CPU确认所提供的服务请求时,这些信息将被回传至ICU。CPU与ICU的接口还包含一个中断控制寄存器(ICR),用于保存当前CPU优先级编号(CCPN)、全局中断使能/禁用位(IE)以及挂起中断优先级编号(PIPN)。有关CPU与ICU接口以及CPU中断处理的更多详细信息,请参阅CPU章节。
- DMA与ICU的接口:DMA模块有一个接口连接到中断路由器模块的一个ICU。DMA接收来自ICU的服务请求信息,触发内部目标通道,并立即向ICU确认,同时清除相关的SRN。DMA与ICU的接口包含一组寄存器,用于接收ICU提供的服务请求信息(SRPN、SRN索引、ECC),并在下一个时钟周期将这些信息与确认信号一起回传给ICU。DMA通道的优先级方案与中断系统相同:SRPN编号越高,服务请求优先级越高;DMA通道编号越高,其优先级越高,其中通道0的优先级最低。
- 软件发起的中断:软件可以通过向任何SRN的服务请求控制寄存器写入数据来设置服务请求位(SRR),从而发起服务请求。这种软件发起的服务请求与硬件发起的服务请求采用相同的处理机制。在SRN中设置SRR位后,软件发起的服务请求和硬件发起的服务请求将无法区分。因此,软件应仅使用未被硬件发起的服务请求占用的SRN和中断优先级编号。TC21x/TC22x/TC23x为每个CPU提供了多组通用服务请求SRN,用于支持软件发起的中断。每个已实现的TriCore CPU都有一组这样的SRN,每组包含四个SRN。这些SRN未连接到内部或外部硬件触发信号,仅可作为软件中断或软件发起的服务请求使用,被称为通用服务请求节点(SRC_GPSRxy,x为组编号,y = 0 - 3)。此外,任何其他未使用的SRN也可用于生成软件中断。
- 外部中断:四个SRN(Int_SCUSRC[3:0])被保留用于处理外部中断。外部GPIO端口输入信号(边沿/电平触发、选通等)的设置能够产生中断请求,该设置由外部请求单元(ERU)控制。ERU的功能在SCU章节中有详细描述。
5.10 中断向量表使用方式
- Interrupt Vector Table Address Calculation:TriCore接受中断时,通过基中断向量表指针BIV和中断优先级号PIPN计算中断向量表入口地址。其架构提供了三种配置向量表的方式:32字节配置,可将小的中断例程直接放入向量表;8字节配置,能减小向量表大小;还可通过屏蔽PIPN将向量表缩减为单个入口。
- Initialization and Installation of Interrupts:初始化和安装中断的步骤包括定义ISR指针数组、定义指向该数组起始位置的指针、编写安装中断的函数
interruptHandlerInstall
。在interruptHandlerInstall
函数中,将ISR入口地址存储到数组中。当中断发生时,interruptHandler
函数会被调用,执行完ISR后通过rfe
指令返回。 - C Code Example:
// 定义ISR指针数组,最多支持255个中断
void (*isr_pointer_array[256])(void);
// 定义指向ISR指针数组起始位置的指针
void (**isr)(void) = isr_pointer_array;
// 安装中断的函数,接收中断优先级和ISR入口地址作为参数
void interruptHandlerInstall(long int SRprio, long int addr) {
// 将ISR入口地址存储到数组中
*isr_pointer_array[SRprio] = (void (*)(void))addr;
}
// 中断处理函数,在中断发生时被调用
void interruptHandler(void) {
// 根据中断优先级号从数组中获取对应的ISR并执行
isr[__mfcr(ICR) & 0xFF]();
// 从中断返回
asm("rfe");
}
- Global Interrupt Enable:在中断能够发生之前,必须全局启用中断系统。中断控制寄存器ICR中的全局中断使能位IE用于启用CPU服务请求系统,假设编译器支持通过
__enable()
来设置该位。
int main() {
// 初始化中断向量表等操作(如有其他初始化代码,可在此添加)
// 启用全局中断
__enable();
// 主程序其他代码
while (1) {
// 主循环
}
return 0;
}
6. 横向对比
特性 | NVIC | GIC | **RISC-V ** | RH850G3M INTC | Tricore IR |
---|---|---|---|---|---|
中断类型 | IRQ/NMI | SPI/PPI/SGI/LPI | 外部/软件/定时器 | 多通道分级中断 | 硬件任务触发 |
优先级管理 | 动态抢占(8-16级) | 静态配置(16-256级) | 可编程优先级仲裁 | 固定优先级分组 | 硬件优先级队列 |
多核支持 | 单核 | 多核负载均衡 | 需扩展实现 | 多核任务协同 | 跨核中断路由 |
延迟优化 | 硬件自动压栈 | 软件上下文切换 | 依赖具体实现 | 硬件任务寄存器 | 确定性响应周期 |
安全认证 | IEC 61508 SIL-3 | 无原生支持 | 需定制 | ISO 26262 ASIL-D | ISO 26262 ASIL-D |
典型场景 | 低功耗嵌入式设备 | 手机/服务器 SoC | 可定制化 AIoT 芯片 | 汽车 ECU | 动力系统控制 |