RISC-V APLIC 中断模块总结——第二篇
发布时间:2026/9/4 6:11:46来源:尧图网络
03 · 关键寄存器详解APLIC 寄存器按功能分成几大区。日常配置中断只用到其中一小部分其余是版本/安全/诊断寄存器。先看必须重点关注的再附完整映射表。基地址APLIC1 0xF0A00000APLIC2 0xF0A20000每个 APLIC 实例都有独立的 M/S0/S1 三个域所以同一个寄存器在三个域各有三份。3.1 必须重点关注的寄存器Top 8①APLIC_CTL偏移 0x0020读/写复位 0x0000_0000全局控制寄存器初始化时配一次即可。位名称说明7PTY_M优先级仲裁模式0基于域优先级默认1基于 Hart 公平轮询1E_CPC使能 CPC 接口基于 master ID 的寄存器访问保护0禁用默认1启用②APLIC_M/S0/S1_DOMAIN_CFG偏移 0x8000 / 0xC000 / 0x10000复位 0x8000_0004每个域的总开关。位名称说明8IE该域所有中断的全局使能1使能0关闭2DM中断传递模式1MSI本芯片固定0BE大小端访问0小端1大端代码里初始化时先写 0 关掉所有域配完 CTL 后统一写IE1使能。③APLIC_M/S0/S1_SOURCECFG_N偏移0x8000 N*4每个源一个配置中断源的核心寄存器N 为中断源编号APLIC1: 11023APLIC2: 1256。位名称说明10D委托位只有 M 域有S0/S1 域无此位1委托给子域2:0SM见下表SM字段含义D0 时设置触发方式SM 值含义0x0中断无效inactive0x1中断卸载detached不接任何域0x4上升沿触发rising edge0x5下降沿触发falling edge0x6高电平触发high level0x7低电平触发low levelSM字段含义D1 时设置委托目标SM 值含义0x0委托到 Supervisor0 Domain0x1委托到 Supervisor1 Domain⚠️ 手册位域说明里一句写当 D 为 1 时SM 比特位无效另一句又写D1 时 SM 用于设置委托目标0→S0、1→S1前后矛盾。以代码为准D1 时 SM 的低位才是委托目标代码宏APLIC_DELEGATE_M_TO_S00、APLIC_DELEGATE_M_TO_S11。⚠️ 手册寄存器图把 SM 标成SM[1:0]2 bit但取值有 0x4~0x7实为3 bit。以代码aplic_reg_riscv.h为准。委托到底是什么意思结合 01 篇 1.4委托是单向的只有M 域的SOURCECFG有 D 位所以只能M → S0 或 M → S1。S0/S1 域的SOURCECFG没有 D 位不能继续往下委托。一个源被 M 域D1委托后它就不再在 M 域产生中断M 域的 pending 不再置位而是流转到指定的子域S0 或 S1由该子域的SOURCECFG.SM触发方式TARGET目标SETIENUM使能真正完成配置。换句话说S0/S1 域能处理的中断其源都必须先在 M 域被委托下来。M 域是总闸由最高特权级的 M 软件决定每个源归谁。④APLIC_M/S0/S1_TARGET_N偏移0xB000 N*4指定该中断源投递给谁、以什么 EIID也是配置中断的核心。位名称说明20:18Hart_Index目标 hart有效 03对应 Core0Core315:13ContextDMSI 上下文Guest Index普通场景填 07:0EIID投递的外部中断标识同时决定该中断的优先级越小越高代码中只用到HART_INDEX3 bit和EIID6 bit值 1~63两个字段Context 填 0。每个源都能投给任意 hart 吗能。每个源都有自己独立的TARGET_NHart_Index由软件写 0~3APLIC 机制上不把源固定绑定到某个核手册第 7.3.7.2 节的中断源表也只标注所属 APLIC和内部中断号没有绑定核字段。实际使用只需满足两点① 目标 hart 处于可接收 MSI 的状态有 credit、未掉电② 该 hart 上已正确配置了对应 EIID 的核内使能位和向量表条目。⑤ 挂起位组SETIPx/SETIPNUM/CLRIPx/CLRIPNUM寄存器作用SETIPx0x9C00 x*4APLIC1 x0~31位图方式置挂起1 bit 1 个源SETIPNUM0x9CDC写中断编号置单个挂起位CLRIPx0x9D00 x*4位图方式清挂起CLRIPNUM0x9DDC写中断编号清单个挂起位软件可用SETIPNUM模拟一次软件中断。⑥ 使能位组SETIEx/SETIENUM/CLRIEx/CLRIENUM寄存器作用SETIEx0x9E00 x*4位图方式使能中断SETIENUM0x9EDC写中断编号使能单个中断源CLRIEx0x9F00 x*4位图方式关闭使能CLRIENUM0x9FDC写中断编号关闭单个中断源使能代码初始化时用SETIENUM 源编号使能Suspend/Resume时用CLRIENUM/SETIENUM。⑦APLIC_M/S0/S1_GENMSI偏移 0xB000软件主动生成一条 MSI模拟向某个 hart 发中断。位名称说明20:18Hart_Index目标 hart15:13ContextGuest Index12BUSY写寄存器置 1发送完成清 07:0EIID要发送的 EIID⑧ 安全寄存器块偏移 0x4000 起功能安全用寄存器偏移说明SFTY_PASSWD0x4000安全寄存器写保护口令SFTY_CTRL0x4004锁步使能 LSE 等代码初始化用APLIC_SFTY_LOCKSTEP_ENABLESFTY_DIAG0x4008诊断错误注入控制SFTY_BUILD0x400C安全版本信息只读SFTY_ERR_STA0x4040安全错误状态只读粘性SFTY_LAT_ERR0x4044潜在错误状态只读3.2 完整寄存器映射表APLIC1 为例偏移 (Hex)寄存器说明复位值0x0000APLIC_BUILD_1版本只读0x0000_00010x0004APLIC_BUILD_2能力ND/MSTY/DCE/SFTE/CPCE/INTTP/NUM_IRQS0x03FF_10D20x0008APLIC_BUILD_3能力NUM_EIID/NUM_CNTXT/NUM_HART0x0020_41000x0020APLIC_CTLPTY_M / E_CPC0x0000_00000x0030APLIC_NOC_ERRNoC 接口错误状态0x0000_00000x0060APLIC_DOMAIN_TDM域时间分配选择0x0000_00000x0070APLIC_OVRRUN溢出状态读/清0x0000_00000x4000~0x4044安全寄存器块见 3.1 ⑧—M 域0x8000M_DOMAIN_CFG机器域配置0x8000_00040x8000N*4M_SOURCECFG_N源 N 配置N1~10230x0000_00000x9C00~M_SETIP0..31置挂起位图0x0000_00000x9CDCM_SETIPNUM置挂起编号0x0000_00000x9D00~M_CLRIP0..31清挂起位图0x0000_00000x9DDCM_CLRIPNUM清挂起编号0x0000_00000x9E00~M_SETIE0..31使能位图0x0000_00000x9EDCM_SETIENUM使能编号0x0000_00000x9F00~M_CLRIE0..31关使能位图0x0000_00000x9FDCM_CLRIENUM关使能编号0x0000_00000xB000M_GENMSI生成 MSI0x0000_00000xB000N*4M_TARGET_N目标N1~10230x0000_0000S0 域同 M 域结构偏移 0x40000xC000S0_DOMAIN_CFG监管者域0 配置0x8000_00040xF000S0_GENMSI生成 MSI0x0000_0000S1 域同 M 域结构偏移 0x80000x10000S1_DOMAIN_CFG监管者域1 配置0x8000_00040x13000S1_GENMSI生成 MSI0x0000_0000S0/S1 域的 SOURCECFG / SETIP / CLRIP / SETIE / CLRIE / TARGET 与 M 域同名同结构仅偏移整体后移 0x4000 / 0x8000。完整三域结构见代码aplic_reg_riscv.h的struct APLIC_tag。3.3 寄存器结构在代码中的对应寄存器定义文件Source/mcal/eclipse/plugins/Base_ARCH3DXXM10I0RX/Hardware/include/module_riscv/aplic_reg_riscv.hc struct APLIC_tag { APLIC_BUILD_1_tag BUILD_1; /* 0x0000 */ ... APLIC_CTL_tag CTL; /* 0x0020 */ ... struct { /* Machine Domain 0x8000-0xBFFF */ APLIC_DOMAIN_CFG_tag DOMAIN_CFG; /* 0x8000 */ APLIC_SOURCECFG_N_tag SOURCECFG[1023]; /* 0x8004... */ APLIC_SETIP_X_tag SETIP[17]; /* 0x9C00 */ APLIC_SETIPNUM_tag SETIPNUM; /* 0x9CDC */ APLIC_CLRIP_X_tag CLRIP[17]; /* 0x9D00 */ ... APLIC_GENMSI_tag GENMSI; /* 0xB000 */ APLIC_TARGET_N_tag TARGET[1023]; /* 0xB004... */ } M_DOMAIN; struct { /* S0 Domain 0xC000-0xFFFF */ ... } S0_DOMAIN; struct { /* S1 Domain 0x10000-0x13FFF */ ... } S1_DOMAIN; }; ⚠️ 代码SOURCECFG[1023]和TARGET[1023]是上限 1023但 4046S 的 APLIC2 实际只有路源APLIC1 才是 1023 路配置时注意不要越界。04 · 代码配置与常用方式本篇基于 AUTOSAR 4.4.0 MCAL 的Irq 模块Source/mcal/eclipse/plugins/Irq_ARCH3DXXM10I0RX/讲清楚怎么配一个中断、初始化流程长什么样、有哪几种常用方式。4.1 代码文件地图文件作用include/Irq.hIrq 模块头API、配置结构体、APLIC 实例/域索引、锁步宏source/Irq.cAPLIC 驱动实现初始化、源配置、Suspend/Resumesource/intc_lld.c/include/intc_lld.h老式 INTCPPC 风格驱动嵌套兼容用Hardware/include/module_riscv/aplic_reg_riscv.hAPLIC 寄存器结构体定义Hardware/include/module_riscv/intc_reg_riscv.h老式 INTC 寄存器定义config/Irq_APLIC_ccrc4045s.xdmAPLIC 配置项定义EB tresosmcal_cfg/CCRC4045S/source/Irq_Cfg.c实际生成的中断配置源→EIID→handler 映射common/vector_riscv/major_interrupt.c外部中断向量入口读 topei 跳转4.2 配置一个中断需要哪几个信息每个中断源在配置里就是一个Irq_SourceListConfigType结构体需要 4 个字段字段取值说明IrqEiidM 模式 163S 模式 1255决定优先级同一核内不能重复IrqSourceId1~1023硬件中断源号全芯片唯一对应某个外设的一路中断请求IrqSourceMode见下触发方式IrqHandler函数名中断服务函数IrqSourceId不是引脚编号。它是 APLIC 的中断源编号对应的是某外设产生的某一路中断请求例如手册第 7.3.7.2 节的中断源表里源 256 对应 PIT0 的 CH0 中断请求源 990 对应 ADC01 的 GRP0。一个外设往往有多路中断源PIT 有多个通道、ADC 有多个组每路各占一个源号这些源号是芯片设计时固定分配好的不是可自由接到任意引脚的。IrqSourceMode枚举值c typedef enum { IRQ_SM_INACTIVE 0x0, /* 无效 */ IRQ_SM_DETACHED 0x1, /* 卸载 */ IRQ_SM_RISING_EDGE 0x4, /* 上升沿 */ IRQ_SM_FALLING_EDGE 0x5, /* 下降沿 */ IRQ_SM_HIGH_LEVEL 0x6, /* 高电平 */ IRQ_SM_LOW_LEVEL 0x7 /* 低电平 */ } Irq_SourceModeType; 触发方式到底起什么作用它告诉 APLIC这个外设的中断信号是什么形态电平还是边沿APLIC 据此去采样并锁存 pending 位。配置必须与外设实际输出的中断信号形态匹配否则会漏中断或反复触发触发方式适合的信号行为高电平 / 低电平电平型中断外设置标志位后中断线一直保持有效电平直到软件清标志电平有效期间持续算有中断软件清 pending 后若电平仍有效会再次触发上升沿 / 下降沿脉冲/边沿型中断一个短暂脉冲表示事件脉冲很快消失检测到跳变沿后锁存 pending脉冲消失后 pending 仍保留直到软件清以PIT为例PIT 计数到 0 时把中断标志位TIF置 1这个标志保持高电平直到软件写 1 清除手册 40.4.2所以 PIT 是电平型中断。因此代码示例里 PIT 配的是IRQ_SM_HIGH_LEVEL高电平触发——这是正确匹配。如果给 PIT 配成上升沿触发会怎样边沿触发只认 0→1 的跳变瞬间若 APLIC 使能该源时TIF已经是 1比如中断早就产生了就采不到这个上升沿这次中断直接丢失之后只有等标志被清成 0 再重新置 1才会产生新的跳变沿触发。所以电平型中断配成边沿触发是错误的漏中断。反过来短暂脉冲型中断配成电平触发也可能漏脉冲太短、电平期间没被采样到。上升沿和下降沿响应时间不一样吗不会。边沿/电平的响应延迟都取决于 APLIC 的采样同步时钟几个时钟周期内识别不取决于沿的方向。上升沿 vs 下降沿只是选择关注哪个跳变极性用来匹配外设信号的极性比如低有效的中断线用下降沿/低电平。两者的真正区别是语义边沿 事件脉冲过后仍记住电平 状态持续有效而不是谁更快。实际配置示例Irq_Cfg.cc Irq_SourceListConfigType Irq_Core0MmodeSrcListCfgArray[] { { .IrqEiid EIID_1, .IrqSourceId 256, .IrqSourceMode IRQ_SM_HIGH_LEVEL, .IrqHandler PIT0_CH0_ISR }, { .IrqEiid EIID_52, .IrqSourceId 990, .IrqSourceMode IRQ_SM_HIGH_LEVEL, .IrqHandler ADC01_GRP0 }, { .IrqEiid EIID_53, .IrqSourceId 992, .IrqSourceMode IRQ_SM_HIGH_LEVEL, .IrqHandler ADC01_GRP2 }, ... }; 含义Core0 上PIT0 通道 0 的中断源硬件源 256被赋予 EIID1最高优先级高电平触发ISR 是PIT0_CH0_ISR。4.3 初始化流程Irq_Init→ 内部逐层配置Irq_Init()调用链Irq_Init→Irq_sInit→Irq_sCoreModeInit→Irq_sInterruptSourceInit。硬件实例初始化主核执行关掉 M/S0/S1 三个域的全局使能DOMAIN_CFG 0。配APLIC_CTLE_CPC默认关PTY_M默认域优先级。配APLIC_SFTY_CTRL锁步使能。重新使能三个域DOMAIN_CFG.IE 1。每个中断源的初始化Irq_sInterruptSourceInit对每个配置的中断源按以下顺序操作c /* 1. 设置向量表把 ISR 地址填到 m_AplicIsrVectorTable[core][eiid] */ m_AplicIsrVectorTable[CoreId][eiidIdx] (uint32)IrqSrcListCfgPtr-IrqHandler; /* 2. 在核内使能该 EIID写核内 IMSIC 的使能位 */ Hart_M_ExtInterruptEnable(eiidIdx); /* 3. 配置源触发方式SOURCECFG.SM */ APLIC1_PTR-M_DOMAIN.SOURCECFG[IrqSrcIdIdx - 1].R sourceCfgVal; /* 4. 配置目标TARGETHART_INDEX EIID */ APLIC1_PTR-M_DOMAIN.TARGET[IrqSrcIdIdx - 1].R targetCfgVal; /* 5. 使能该中断源 */ APLIC1_PTR-M_DOMAIN.SETIENUM.R IrqSrcIdIdx; 关键代码片段Irq.cc sourceCfgVal (uint32)((uint32)IrqSrcListCfgPtr-IrqSourceMode APLIC_SOURCECFG_N_SM_MASK); targetCfgVal APLIC_TARGET_N_HART_INDEX(CoreId) | (eiidIdx APLIC_TARGET_N_EIID_MASK); ... if (IrqSrcIdIdx 512u) { /* 源 1~512 → APLIC1 */ APLIC1_PTR-M_DOMAIN.SOURCECFG[IrqSrcIdIdx - 1].R sourceCfgVal; APLIC1_PTR-M_DOMAIN.TARGET[IrqSrcIdIdx - 1].R targetCfgVal; APLIC1_PTR-M_DOMAIN.SETIENUM.R IrqSrcIdIdx; } else if (IrqSrcIdIdx 1024u) { /* 源 513~1023 → APLIC2 */ APLIC2_PTR-M_DOMAIN.SOURCECFG[IrqSrcIdIdx - 512 - 1].R sourceCfgVal; APLIC2_PTR-M_DOMAIN.TARGET[IrqSrcIdIdx - 512 - 1].R targetCfgVal; APLIC2_PTR-M_DOMAIN.SETIENUM.R IrqSrcIdIdx - 512u; } ⚠️ 这里的 512 分界是代码面向 4045S/4086S写死的4046S 手册是 APLIC11023 / APLIC2256需核对是否适配。Suspend / Resumec void Irq_SuspendInterruptSource(Irq_InterruptSrcIdType SourceId); /* 关闭某中断源 */ void Irq_ResumeInterruptSource (Irq_InterruptSrcIdType SourceId); /* 恢复某中断源 */ 内部对应写CLRIENUM关和SETIENUM开并维护Irq_InterruptSourceStatus[]状态数组。4.4 硬件实例配置项c Irq_HwInstConfigType Irq_HwInstConfig { .IrqMasterCore IRQ_MASTER_COREID, /* 主核负责配 APLIC 全局寄存器 */ .IrqCpcEn FALSE, /* CPC 访问保护默认关 */ .IrqPriorityMode IRQ_PRIORITY_MODE_DOMAIN_PRIORITY, /* 域优先级仲裁默认 */ .IrqLockstepEn TRUE /* 锁步比较默认开 */ }; 配置项含义IrqCpcEn是否启用 CPCmaster ID 访问保护普通场景 FALSEIrqPriorityModeDOMAIN_PRIORITY域优先或HART_FAIR_RRhart 公平轮询IrqLockstepEn是否开启锁步比较功能安全4.5 三种常用配置方式方式一M 模式直接处理最常用默认中断直接归属M 域ISR 在 M 模式运行。代码里IrqTargetCoreMode HART_M_MODE。c /* 源 → M 域 SOURCECFG 直接配触发方式TARGET 配 hartEIIDSETIENUM 使能 */ APLIC1_PTR-M_DOMAIN.SOURCECFG[src-1].R sourceCfgVal; APLIC1_PTR-M_DOMAIN.TARGET[src-1].R targetCfgVal; APLIC1_PTR-M_DOMAIN.SETIENUM.R src; 方式二S 模式处理需要委托 M→S0中断先归 M 域再委托给 S0 域让 S 模式通常是 OS接管。代码里IrqTargetCoreMode HART_S_MODE。c /* M 域置 D 位 SM0表示委托到 S0 */ APLIC1_PTR-M_DOMAIN.SOURCECFG[src-1].R APLIC_SOURCECFG_N_D_MASK | APLIC_DELEGATE_M_TO_S0; /* S0 域真正配置触发方式、目标、使能 */ APLIC1_PTR-S0_DOMAIN.SOURCECFG[src-1].R sourceCfgVal; APLIC1_PTR-S0_DOMAIN.TARGET[src-1].R targetCfgVal; APLIC1_PTR-S0_DOMAIN.SETIENUM.R src; 委托本质M 域里把该源标记为委派给子域D1SM 指定 S0 或 S1真正的触发/目标/使能配置在 S0/S1 域完成。委托后它还不可屏蔽吗不再不可屏蔽。手册里不可屏蔽指的是——对 S 模式软件而言M 域的中断请求是不可屏蔽的因为 M 特权级更高。一旦源被D1委托到 S0/S1它就变成了普通的S 模式外部中断SEI受 S 模式的sstatus.SIE、sie、eithreshold等控制可以像普通中断一样被 S 模式屏蔽/降级。所以委托 放弃 M 级的不可屏蔽属性把处理权下放给 S 模式。方式三嵌套老式 INTC兼容 NXP 软件芯片为了兼容 NXP PPC 老代码在 APLIC 里嵌套了 10 个老式 INTC 实例INTC_0~INTC_9。这些 INTC 实例作为 APLIC 的中断源源号 1、7、13、19、25、31、37、43、49、55接入各自有一个 handlerc { .IrqEiid EIID_54, .IrqSourceId 1, .IrqHandler Irq_AplicIntc0_Handler }, { .IrqEiid EIID_55, .IrqSourceId 7, .IrqHandler Irq_AplicIntc1_Handler }, ... 老式 INTC 的初始化走Irq_AplicIntcInit()内部写PSR优先级 PRC_SELN、CPR响应时读IACKR得向量、写EOIR结束——这就是 NXP 5777M 那套机制。代码注释明确说The design of nesting the INTC module within APLIC will be removed in the next design version.下个版本会移除嵌套 INTC新代码应直接走 APLIC方式一/二。4.6 向量表与 ISR 的衔接ISR 函数会被填入按核 × EIID组织的向量表c extern volatile uint32 m_AplicIsrVectorTable[RESOURCE_CHIP_CORE_NUM][HART_M_EIID_MAX]; 外部中断入口major_interrupt.c的MI11_Handlerasm csrrw t1, mtopei, t0 ; 读 M 模式顶部 EIID同时写 0 ANDI t1, t1, 0x00ff ; 取低 8 位EIID slli t1, t1, 0x2 ; ×432 位表项 la t2, m_AplicIsrVectorTable ADD t2, t2, t4 ; hart 偏移每核 64×4256 字节 ADD t2, t2, t1 ; EIID 偏移 lw t3, 0(t2) ; 取 ISR 地址 jalr t3 ; 跳转执行 05 · 与 NXP MPC5777M 的 INTC 模块对比NXP MPC5777M 是 Power Architecturee200z7 双核MCU其中断控制器是经典的PPC INTC。CCRC4046S 是 RISC-VARC-V 内核MCU中断用RISC-V AIAAPLIC IMSIC CLINT。两者理念完全不同本篇逐项对比并给出迁移要点。5.1 一句话总结差异维度NXP MPC5777M (INTC)RISC-V (APLIC)架构Power ArchitectureRISC-V AIA控制器构成单个 INTC1024 源APLIC1APLIC2 级联 每核 IMSIC CLINT优先级配置每源独立PRI 字段PSR.PRIN无独立优先级寄存器EIID 越小优先级越高中断响应握手读IACKR拿向量 → 处理 → 写EOIR读mtopei/stopei拿 EIID → 处理 →写 0 到 topei向量机制软件向量 / 硬件向量IVPR IACKR向量表按hart × EIID索引抢占CPR当前优先级寄存器 阈值eithreshold 硬件阈值栈投递方式电平/引脚直连DMSI 消息总线投递域特权级隔离无M / S0 / S1 三域 委托机制功能安全独立安全机制ASIL-D锁步/ECC/EDC/E2E5.2 逐项详细对比5.2.1 中断源与规模MPC5777M INTC单一 INTC支持约 1024 个中断源软件向量模式每核一套 CPR/IACKR/EOIR。CCRC4046S APLIC两个 APLIC 级联1023 256 1279 路投递给 4 个 hartCore0~Core3。5.2.2 优先级机制差异最大MPC5777M每个中断源的PSR.PRIN6 bit0~15 实际可用单独配优先级越大越高CPR记录当前服务中断的优先级用于抢占判断。CCRC4046S没有优先级寄存器这个字段。优先级直接等于 EIID编号越小越高。给中断更高优先级的唯一办法是给它分配更小的 EIID。MPC5777MCCRC4046S优先级来源PSR.PRIN0~15大者优先EIID1~63/255小者优先优先级范围16 级实际常 0~15M 63 级 / S 255 级抢占依据CPR 阈值eithreshold 硬件阈值栈5.2.3 中断响应握手MPC5777M三段式握手c // 1. 读 IACKR 得到中断向量号硬件向量模式或读当前向量 // 2. 执行 ISR // 3. 写 EOIR 结束中断恢复 CPR CCRC4046S两段式c // 1. 读 mtopei/stopei CSR得到 EIID读取本身可同时完成 // 2. 执行 ISR结束时可再向 topei 写 0弹阈值栈 关键区别NXP 用内存映射寄存器 IACKR/EOIR做握手CCRC4046 用CSRmtopei/stopei且读即认领。5.2.4 投递与拓扑MPC5777M外设中断引脚直接汇总到 INTCINTC 内部仲裁后拉高核的中断请求线。CCRC4046SAPLIC 采样后打包成 DMSI 消息经 DMSI 总线投递到每个核的 IMSIC 中断文件再由核响应。多了一级消息化抽象。5.2.5 特权级/域隔离MPC5777M无域概念单核/双核对称各自处理。CCRC4046SM/S0/S1 三域可把中断委托给 S 模式OS处理天然支持 M/S 特权隔离和虚拟化VS/guest。5.2.6 向量表MPC5777MIVPR指向向量基址硬件向量模式下由 INTC 直接算出向量地址软件向量模式由IACKR.INTVEC索引。CCRC4046Sm_AplicIsrVectorTable[hart][EIID]外部中断入口读 topei 得 EIID 后直接查表跳转。5.3 寄存器对照表迁移速查NXP 5777M INTC 寄存器作用CCRC4046S 对应INTC_BCR硬件向量模式开关无直接对应由内核配置决定向量模式INTC_MPROT主保护APLIC_CTL.E_CPCCPC 访问保护INTC_CPR当前优先级核内eithreshold 硬件阈值栈INTC_IACKR读中断向量读mtopei/stopeiCSR得 EIIDINTC_EOIR结束中断写 0 到mtopei/stopeiINTC_PSR.PRIN配置优先级无对应EIID 即优先级INTC_PSR.PRC_SELN选择核APLIC_TARGET.Hart_IndexINTC_SSCIR软件触发/清除APLIC_SETIPNUM/APLIC_CLRIPNUM无—APLIC_SOURCECFG触发方式 委托无—APLIC_TARGET.EIID目标编号 优先级无—APLIC_SETIENUM/CLRIENUM源使能开关5.4 迁移要点清单改优先级配置方式原来给源设 PRI15现在改成给源分配一个较小的 EIID。注意 EIID 越小优先级越高与 NXP 的 PRI 越大越高相反。改中断结束方式把写 EOIR改成写 0 到 topei。且 RISC-V AIA 里读 topei 时往往已经认领了中断。改向量表组织原来是单一向量表 IACKR 索引现在是hart × EIID二维表且每个 EIID 独立向量。改投递认知不用再关心中断引脚直连 INTC理解外设 → APLIC → DMSI → IMSIC → 核这条消息链。利用域的隔离如果需要把中断交给 OSS 模式用委托机制M 域 D 位 S0 域配置这是 NXP INTC 没有的能力。短期兼容芯片在 APLIC 里嵌套了 10 个老式 INTC 实例走Irq_AplicIntcInit IACKR/EOIR可以让老代码原样跑但该设计下版本会移除新代码应直接用 APLIC。5.5 对比结论结论说明更灵活APLIC 支持 1279 路源、三域、委托、虚拟化远超 NXP INTC更反直觉优先级隐含在编号里越小越高没有显式优先级寄存器投递更抽象消息化DMSI替代了电平直连理解成本更高迁移有桥嵌套 INTC 提供兼容层但只是过渡方案
网站建设高端定制企业官网