1. AINTC核心设计思路与中断机制总览在嵌入式实时系统的开发中中断处理的速度和可靠性直接决定了系统的性能上限。想象一下你正在处理一个关键的传感器数据此时一个更紧急的通信请求到来系统能否立即响应还是必须等当前任务完成ARM中断控制器AINTC就是为了解决这类问题而生的专用硬件模块。它不是一个简单的“信号转发器”而是一个具备智能调度能力的“交通指挥中心”。其核心价值在于通过硬件层面的优先级仲裁、嵌套管理和向量化跳转将中断响应从“软件轮询判断”的沉重负担中解放出来实现了微秒级甚至纳秒级的确定性延迟。AINTC的设计哲学是“硬件能做的绝不交给软件”。传统的中断处理流程中CPU接收到中断信号后需要进入一个通用的中断服务程序ISR然后通过读取状态寄存器、查询中断向量表等一系列软件操作才能最终跳转到具体的中断处理函数。这个过程虽然灵活但引入了不可预测的延迟。AINTC则将优先级比较、嵌套逻辑判断、乃至ISR地址计算这些步骤全部用硬件电路实现。当多个中断同时发生时硬件优先级编码器会立即选出最高优先级的中断当中断嵌套发生时硬件会自动管理嵌套层级屏蔽低优先级中断通过向量化CPU甚至可以直接读取到一个计算好的、准确的ISR入口地址并跳转。这种硬件加速的设计使得中断响应路径极短特别适合电机控制、数字电源、汽车ABS等对实时性要求苛刻的场景。从架构上看AINTC位于众多外设中断源如UART、Timer、ADC与ARM核心之间。它管理着多达128个系统中断在部分型号中并将它们映射到有限的几个主机中断通常是IRQ和FIQ输出给CPU。其内部工作流程可以概括为状态捕获 - 优先级仲裁 - 嵌套管理 - 向量生成 - 通知CPU。每一个环节都有对应的寄存器组进行配置和控制赋予了开发者精细化管理中断行为的能力。理解这套流程是驾驭AINTC、编写高效可靠中断服务程序的基础。2. 中断嵌套机制深度解析与实现中断嵌套简而言之就是允许高优先级中断打断正在执行的低优先级中断服务程序。这是实现系统实时性的关键。如果没有嵌套一个低优先级的、冗长的中断服务程序会阻塞所有其他中断可能导致系统错过关键事件。AINTC提供了三种嵌套模式每种模式在灵活性、复杂性和性能之间做出了不同的权衡。2.1 三种嵌套模式对比与选型在控制寄存器CR的NESTMODE字段中我们可以配置以下模式嵌套模式 (NESTMODE)工作原理优点缺点适用场景无嵌套 (0)任何中断服务程序执行期间所有主机中断IRQ/FIQ被自动禁用。实现最简单无需软件管理嵌套状态不存在重入问题。实时性最差低优先级ISR会阻塞所有高优先级中断。对实时性要求极低或中断服务程序非常简短的简单应用。自动独立嵌套 (1)为每个主机中断如IRQ和FIQ独立维护一个嵌套层级。当一个主机中断被服务时自动根据其优先级屏蔽同级及更低优先级的通道。硬件自动管理软件开销小。不同主机中断之间的嵌套逻辑清晰。灵活性一般嵌套策略由硬件固定。需要基本嵌套功能且希望减少软件复杂度的通用场景。自动全局嵌套 (2)所有主机中断共享一个全局嵌套层级。任何中断服务时都会根据当前最高优先级中断来更新全局嵌套级别屏蔽更低优先级的所有中断。提供全局统一的优先级管理逻辑一致。不同主机中断类型间的嵌套关系需要仔细设计。推荐模式。适合构建统一的、基于通道优先级的嵌套体系是最常用的模式。手动嵌套 (3)完全由软件控制。进入ISR后软件需手动禁用主机中断更新允许触发的中断集合再重新使能。灵活性最高可以实现任何复杂的嵌套策略。软件复杂度最高容易出错且响应速度受软件执行速度影响。需要实现非标准优先级策略如动态优先级调整或研究性项目。对于绝大多数应用自动全局嵌套模式NESTMODE2是官方推荐且最实用的选择。它平衡了性能与易用性。在此模式下AINTC内部维护一个“当前嵌套优先级”值。当一个中断被响应时所有优先级等于或低于此中断的通道都会被硬件自动屏蔽只有更高优先级的中断才能产生新的主机中断请求从而实现抢占。2.2 自动主机中断嵌套的软件流程详解官方文档给出了在自动主机中断嵌套模式下ARM硬件中断服务例程HISR中应遵循的12个步骤。这不仅仅是一套操作指南更揭示了AINTC硬件与软件协同工作的内在逻辑。我们来逐条拆解其背后的“为什么”禁用ARM硬件中断。这是关键的第一步。目的是在接下来操作AINTC关键寄存器如HINLRn时防止被同一个主机中断再次打断导致嵌套状态管理混乱。这保护了后续步骤的原子性。清除HINLRn寄存器中的OVERRIDE位。HINLRnHost Interrupt Nesting Level Register寄存器的OVERRIDE位是一个手动覆盖开关。当它为1时嵌套级别由软件写入的NESTLVL值决定为0时则由AINTC硬件自动更新。步骤2将其清零就是将嵌套级别的控制权交还给硬件让硬件根据实际发生的中断来暴露expose其优先级。将活动中断的优先级值压入嵌套优先级堆栈。这是一个纯软件行为。我们需要在内存中维护一个栈例如一个数组和一个栈指针用来记录中断嵌套的轨迹。将当前中断的优先级可以从HIPIRn寄存器读取到的通道号或通过CMRx映射的优先级压栈是为了在中断服务完成后能正确恢复之前的嵌套环境。通过设置OVERRIDE位将活动优先级级别写入HINLRn。这是实现嵌套的核心操作。读取当前有效的优先级可能是HIPIRn中的索引然后通过写HINLRn寄存器设置OVERRIDE1并写入优先级值显式地告诉AINTC“现在系统正在服务这个优先级的中断请屏蔽所有优先级等于或低于它的通道”。硬件会根据这个值更新其内部屏蔽逻辑。计算并存储活动中断的ISR地址。...如果CR中的PRHOLDMODE位被设置则解冻HIPIRn和HIPVRn。这一步为向量化跳转做准备。HIPIRn主机中断优先级索引寄存器和HIPVRn主机中断优先级向量寄存器分别保存着最高优先级中断的索引号和其计算出的向量地址。PRHOLDMODE优先级保持模式是一个实用功能当它为1时一旦软件读取了HIPIRn或HIPVRn它们的值就会被“冻结”直到软件显式解冻。这防止了在计算和跳转期间因为新中断到来而导致这两个寄存器值发生变化确保了ISR地址的一致性。解冻操作通常通过再次读取这些寄存器来完成。清除系统中断状态。通过写SECRn系统中断状态使能/清除寄存器的对应位或向SICR系统中断状态索引清除寄存器写入中断索引号来完成。这是至关重要的一步目的是告诉AINTC“这个中断我已经知晓并开始处理了”。如果不清除该中状态会一直保持可能导致中断重复触发或阻塞其他中断。通常建议在跳转到具体ISR之前清除以避免中断嵌套时自身被重复触发。确认并使能ARM硬件中断。此时关键的现场保存和AINTC设置已完成。重新使能ARM核心中断允许更高优先级的中断来抢占当前ISR从而实现真正的嵌套。执行步骤5中存储的地址处的ISR。跳转到具体的中断服务程序执行。在此期间由于步骤4设置了新的嵌套级别只有更高优先级的中断才能抢占此ISR。禁用ARM硬件中断。ISR执行完毕准备退出嵌套管理流程。再次禁用中断确保恢复嵌套状态的操作不被干扰。丢弃嵌套优先级堆栈中最新的优先级级别并通过设置OVERRIDE位将先前的优先级级别恢复至HINLRn。从软件栈中弹出当前中断的优先级。如果栈未空则将栈顶的新优先级即被当前中断抢占的那个中断的优先级写入HINLRn并设OVERRIDE1。这相当于告诉AINTC“当前中断已退出系统现在回到了上一级中断的嵌套环境中”。如果栈已空即退出了最外层中断则应恢复为默认的嵌套级别通常是一个很低的数值表示不屏蔽任何中断。使能ARM硬件中断。所有清理工作完成安全地重新开放中断。中断返回。执行标准的异常返回指令如ARM的BX LR或SUBS PC, LR, #4恢复CPU现场并返回到被中断的程序。实操心得软件栈的设计这里的“嵌套优先级堆栈”需要你自己在内存中实现。一个简单高效的方法是定义一个全局数组uint32_t nest_stack[MAX_NEST_DEPTH]和一个整型栈指针nest_sp。MAX_NEST_DEPTH取决于你系统中间断嵌套的最大可能深度通常8或16就足够了。压栈操作即nest_stack[nest_sp] priority;出栈即priority nest_stack[nest_sp--];。务必确保压栈和出栈操作成对出现且在中断禁用环境下进行以防竞态条件。3. 中断向量化技术原理与实战配置如果说中断嵌套解决了“谁先谁后”的问题那么向量化Vectorization就是为了解决“快一点再快一点”的问题。它的目标是将中断响应路径中的软件查表开销彻底归零。3.1 向量化的工作原理从查表到直跳在没有向量化的传统模式下CPU收到中断后跳转到统一的异常向量表入口如IRQ_Handler。在该通用IRQ_Handler中软件需要读取AINTC的GPIR或HIPIRn寄存器获取最高优先级中断的索引号。根据这个索引号去一个预先定义好的函数指针数组中断向量表中查找对应的ISR地址。跳转到该地址。这个过程至少包含一次内存加载和一次间接跳转增加了延迟。AINTC的向量化功能将第2、3步硬件化。其核心公式非常简单ISR地址 向量基地址 (VBR) 中断索引号 (Index) × 向量大小 (VSR)向量基地址寄存器 (VBR)你需要在内存中开辟一块连续的代码区域用于存放所有中断服务例程的入口代码。这块区域的起始地址就是VBR的值。向量大小寄存器 (VSR)定义了每个ISR入口代码块所占用的空间大小以字为单位1字4字节。它必须足够大以容纳跳转到实际ISR函数体的那几条指令。中断索引号 (Index)即系统中断号0-127由HIPIRn寄存器提供。当使能向量化后HIPVRn寄存器会实时硬件计算VBR (HIPIRn * VSR)的结果。在自动主机中断嵌套流程的第5步你读取HIPVRn得到的直接就是目标ISR的入口地址可以直接跳转过去。3.2 向量化内存布局设计与配置示例假设我们使用自动全局嵌套模式并有两个中断需要处理UART0接收中断系统中断号SYS_INT_UART0_RX 45和Timer0溢出中断SYS_INT_TMR0_OVF 32。我们计划将VBR设置在0x8000 0000。首先决定VSR。假设我们为每个中断入口分配32字节8个字VSR 7因为0代表4字节1代表8字节7代表32字节。这32字节通常可以放下LDR PC, Actual_UART0_RX_ISR ; 跳转到实际的C函数 B . ; 对齐填充或放置其他指令或者更精简的直接是一条加载PC的指令。我们需要在链接脚本如.ld文件中预留这块向量表空间并确保其地址对齐到合适的边界例如32字节对齐。/* 在内存布局定义中 */ .vector_table 0x80000000 : { . ALIGN(32); *(.isr_vector) /* 将所有目标文件的.isr_vector段集中放置于此 */ } RAM然后在C代码中我们需要将各个中断的入口存放到这个区域。一种常见的做法是使用汇编宏或属性来定位函数。例如使用GCC的section属性#define ISR_VECTOR_ENTRY(index) __attribute__((section(.isr_vector), used, aligned(8))) void ISR_##index(void) /* 定义UART0 RX中断的向量入口 */ ISR_VECTOR_ENTRY(45) { __asm volatile (LDR PC, uart0_rx_isr_actual); } /* 定义Timer0溢出中断的向量入口 */ ISR_VECTOR_ENTRY(32) { __asm volatile (LDR PC, timer0_ovf_isr_actual); } /* 实际的C语言中断服务函数 */ void uart0_rx_isr_actual(void) { /* 处理UART接收数据 */ /* ... */ /* 清除中断标志 */ } void timer0_ovf_isr_actual(void) { /* 处理定时器溢出 */ /* ... */ /* 清除中断标志 */ }最后在系统初始化时配置AINTC的向量化寄存器void aintc_vectorization_init(void) { /* 1. 设置向量基地址寄存器 (VBR) */ /* 假设我们通过链接脚本将.isr_vector段放在了0x80000000 */ AINTC-VBR (uint32_t)0x80000000; /* 2. 设置向量大小寄存器 (VSR) */ /* 每个入口分配32字节VSR值设为7 (参见VSR寄存器描述7对应32字节) */ AINTC-VSR 7; /* 0:4字节, 1:8字节, 2:16字节, 3:32字节, 4:64字节, 5:128字节, 6:256字节, 7:32字节? 注意核对手册此处为示例实际需根据VSR位域定义赋值 */ /* 3. 设置向量空地址寄存器 (VNR) */ /* 这是一个安全措施当无中断pending时如果误执行向量跳转会跳转到这个空处理函数 */ AINTC-VNR (uint32_t)null_isr; /* 4. 使能向量化功能通常与优先级保持模式PRHOLDMODE一同配置 */ /* 在控制寄存器CR中可能有一个专门的向量化使能位或者向量化在特定模式下自动生效需查手册 */ /* 例如AINTC-CR | (1 VECTORIZATION_EN_BIT); */ } /* 空ISR通常是一个无限循环或简单的返回 */ void null_isr(void) { /* 可能记录一个错误或者直接返回 */ while(1); /* 或 asm volatile(BX LR); */ }注意事项VSR的配置陷阱技术文档中特别用NOTE强调“即使所需值与默认值相同也必须配置VSR寄存器。”这是一个非常容易忽略的坑。AINTC的VSR寄存器在上电复位后可能是一个未定义的随机值而不是0。如果你不显式配置它向量地址的计算将是错误的导致程序跑飞。因此无论你计划使用的向量大小是多少都必须在初始化流程中明确写入VSR寄存器。3.3 向量与优先级保持模式PRHOLDMODE的协同PRHOLDMODE位是向量化的“最佳搭档”。当PRHOLDMODE1时在主机中断服务例程HISR中第一次读取HIPIRn或HIPVRn后这两个寄存器的值就会被“冻结”或“保持”直到软件通过再次读取来“解冻”。这个机制至关重要。考虑一个场景在步骤5中软件读取HIPVRn获取了ISR地址。但在跳转之前步骤8一个更高优先级的中断发生了。如果没有PRHOLDMODEHIPVRn的值会立即更新为更高优先级中断的地址。如果你仍然使用之前读取的地址跳转就会跳转到错误的中断服务程序。启用PRHOLDMODE后第一次读取的值被锁定即使有新中断到来HIPVRn也不会改变保证了地址的一致性。在完成当前中断的现场保存和状态清除后你需要通过再次读取HIPIRn步骤5中提到的“解冻”来释放这个锁定以便AINTC能响应新的最高优先级中断。4. 关键寄存器精讲与编程模型AINTC的功能通过一系列内存映射寄存器MMR暴露给软件。理解这些寄存器的分工是进行底层编程的前提。我们可以将其分为几个功能组4.1 全局控制与状态寄存器组这组寄存器控制AINTC的整体行为并反映其全局状态。控制寄存器 (CR)这是AINTC的“大脑”。NESTMODE字段选择嵌套模式PRHOLDMODE位启用优先级保持模式这对向量化至关重要。在初始化阶段必须首先配置此寄存器。全局使能寄存器 (GER)一个总开关。只有当GER.ENABLE1时AINTC才会向主机产生中断输出。但注意各个主机中断IRQ/FIQ还有自己的独立使能位在HIER寄存器中。全局嵌套级别寄存器 (GNLR)在自动全局嵌套模式下此寄存器反映了当前被屏蔽的最高通道优先级即嵌套级别。软件可以读取它来了解当前的嵌套状态在手动模式下也可以写入它来强制设置嵌套级别。全局优先级索引寄存器 (GPIR)与全局优先级向量寄存器 (GPVR)这两个寄存器提供了跨越所有主机中断的全局视图。GPIR显示当前所有已使能中断中优先级最高的索引号其最高位NONE指示是否有中断挂起。GPVR则显示该最高优先级中断对应的计算后向量地址。它们常用于调试或非向量化模式下的中断分发。4.2 系统中断管理寄存器组这组寄存器以两种方式管理128个系统中断按索引操作和按位图操作。按索引操作SICR,EICR,EISR效率高适合在ISR中精确操作单个中断。按位图操作SECR1-4,ECR1-4,ESR1-4,SRSR1-4则适合批量操作或初始化。状态设置/清除寄存器 (SRSR,SECR,SICR)SRSR1-4(Raw/Set)反映中断的原始状态是否发生写1可软件触发一个中断用于测试。SECR1-4(Enabled/Clear)反映中断的使能后状态是否发生且被使能在ISR中必须通过写1到此寄存器或写索引到SICR来清除中断状态这是中断被处理的标志。SICR(Indexed Clear)向此寄存器写入一个中断索引号0-127即可清除对应中断的状态。比操作SECR的位图更简洁。使能设置/清除寄存器 (ESR,ECR,EISR,EICR)ESR1-4/ECR1-4通过位图方式使能或禁用指定的系统中断。禁用后即使该中断发生也不会传递到主机。EISR/EICR通过索引号方式使能或禁用系统中断。同样EISR写入索引号使能EICR写入索引号禁用。编程技巧索引操作 vs. 位图操作在ISR中清除中断状态强烈推荐使用SICR寄存器只需一条存储指令AINTC-SICR interrupt_index;。这比“读-改-写”SECRn寄存器位图需要读取当前值与上一个掩码再写回要快得多且是原子的。同样在运行时动态启用/禁用某个中断使用EISR/EICR也更高效。4.3 主机中断与向量化寄存器组这组寄存器直接面向CPU核心主机。主机中断使能寄存器 (HIER)控制IRQ和FIQ这两个主机中断输出是否被使能。即使GER全局使能如果HIER中对应的位为0CPU也收不到中断信号。主机中断优先级索引/向量寄存器 (HIPIR1/2,HIPVR1/2)这是向量化的核心。HIPIRn提供当前挂起且优先级最高的中断索引HIPVRn提供计算好的向量地址。在使能了PRHOLDMODE后读取HIPVRn是获取稳定ISR地址的关键。主机中断嵌套级别寄存器 (HINLR1/2)用于自动主机中断嵌套模式。软件通过操作它的OVERRIDE位和NESTLVL字段来告知AINTC当前的嵌套优先级从而控制哪些低优先级中断被屏蔽。向量化寄存器 (VBR,VSR,VNR)如前所述定义了向量表的基址、每个入口的大小以及空处理例程地址。4.4 通道映射寄存器 (CMR0-CMR25)这是AINTC灵活性的体现。每个系统中断0-127都可以通过一个8位的通道映射寄存器CMR独立配置其主机中断目标映射到IRQ还是FIQ和优先级。位[7:1] - 优先级字段决定该中断在所属主机中断IRQ或FIQ内部的优先级。数值越小优先级越高。通过合理分配优先级可以精细控制中断间的抢占关系。位[0] - 主机中断选择0表示映射到FIQ1表示映射到IRQ。通常将最紧急、最需要快速响应、且不希望被其他中断打断的中断配置为FIQ。例如将系统中断45UART0 RX配置为高优先级IRQ优先级为10/* 假设系统中断45的CMR索引计算方式为每个CMR管理4个中断45/411余1所以是CMR11的[15:8]字段 */ /* 需要根据具体手册确定CMR的布局。假设CMRx的[31:24], [23:16], [15:8], [7:0]分别对应4个连续的中断 */ /* 更通用的方法是使用索引操作寄存器如果支持或查表 */ /* 此处为示意假设有设置函数 */ aintc_map_system_interrupt(45, 1 /* IRQ */, 10 /* Priority */);5. 实战从零构建AINTC驱动与常见问题排查理解了原理和寄存器我们将其整合成一个实用的、可移植的驱动框架并探讨开发中必然会遇到的“坑”。5.1 驱动框架设计与初始化流程一个健壮的AINTC驱动应包含初始化、中断注册/注销、中断使能/禁用、嵌套管理以及向量表管理几个部分。第一步初始化 (aintc_init)。这是最关键的步骤顺序很重要。禁用全局中断在配置硬件前先调用__disable_irq()或类似指令防止配置过程中被意外中断打断。配置控制寄存器 (CR)根据应用需求设置NESTMODE通常为2自动全局嵌套和PRHOLDMODE如果使用向量化则设为1。配置向量化寄存器设置VBR指向你的向量表、VSR每个入口大小、VNR空处理函数地址。切记无论VSR默认值是什么都必须显式写入初始化通道映射 (CMR)将所有系统中断的CMR初始化为一个安全状态例如全部映射到IRQ优先级为最低。清除所有中断状态遍历所有SECRn寄存器或循环写入SICR确保没有残留的挂起中断。禁用所有系统中断遍历所有ECRn寄存器或循环写入EICR关闭所有中断源。使能主机中断设置HIER寄存器使能IRQ和/或FIQ输出。使能全局中断设置GER.ENABLE 1。使能CPU核心中断最后调用__enable_irq()开放中断响应。第二步中断服务例程框架。你的HISR如IRQ_Handler应该严格遵循第2.2节所述的12步流程。这个函数通常用汇编或__attribute__((naked))的C函数编写负责上下文保存/恢复和调用真正的C函数ISR。第三步中断注册与使能。提供类似aintc_register_isr(int sys_int_num, void (*isr)(void), uint8_t priority, uint8_t host_int)的API。这个函数需要将用户提供的C函数isr与系统中断号关联起来存储在一个全局的函数指针数组中。配置对应的CMR寄存器设置优先级和主机中断目标。通过EISR寄存器使能该系统中断。5.2 常见问题排查与调试技巧实录在开发过程中你一定会遇到中断不触发、嵌套混乱、向量跳转错误等问题。下面是我踩过的一些坑和解决方法问题1中断配置正确但永不触发。检查清单GER全局使能了吗AINTC-GER的ENABLE位必须为1。HIER主机中断使能了吗确认IRQ或FIQ对应的位已设置。系统中断使能了吗检查对应的ESRn位或确认EISR操作成功。ARM核心的中断是否全局开启确认CPSR的I位或F位已被清除使能。外设本身的中断使能位开了吗例如UART的接收中断使能位。AINTC只是管理者源头必须产生信号。中断状态清除了吗如果上次中断的状态未被清除SECRn位仍为1新的中断可能无法产生。在初始化时务必清除所有状态。问题2中断嵌套行为不符合预期高优先级中断无法抢占。排查步骤确认NESTMODE设置正确。如果你期望自动嵌套CR寄存器的NESTMODE字段必须是1或2。检查HINLRn寄存器的操作。在自动主机中断嵌套模式下你的HISR是否正确地执行了步骤2-4和步骤10特别是步骤4是否将当前中断的优先级写入了HINLRn并设置了OVERRIDE位这一步是告知AINTC当前嵌套级别的关键。优先级配置是否正确通过CMR寄存器为中断分配的优先级数值数值越小优先级越高。确保高优先级中断的CMR优先级值比低优先级的小。你的HISR在第7步后重新使能了ARM中断吗如果未使能即使AINTC发出了更高优先级的中断请求CPU也不会响应。问题3使能向量化后程序跑飞或进入空ISR。诊断方法首先检查VNR空向量地址是否被正确设置。如果程序跑飞后最终停在了null_isr说明AINTC触发了中断但HIPVRn计算出的地址不在有效的向量表范围内。这强烈指向VBR或VSR配置错误。核对VBR地址。使用调试器查看AINTC-VBR的值是否与你链接脚本中定义的向量表起始地址完全一致地址对齐是否正确通常需要32字节或更大对齐核对VSR值。这是最常见的错误来源。计算VBR (中断索引号 * VSR表示的大小)。用调试器计算这个地址然后查看该地址处的指令是否是你为对应中断号准备的跳转指令VSR寄存器必须被显式初始化检查向量表内容。使用调试器内存查看功能从VBR地址开始检查每个向量入口的指令是否正确。例如对于中断45其入口地址是VBR 45 * size。确认该地址处的指令是跳转到你预期的C函数。确认PRHOLDMODE已启用。如果未启用在读取HIPVRn后到跳转前若有新中断地址可能变化。问题4在调试器中单步执行时中断不触发全速运行就正常。原因与解决这是正常现象。许多调试器在单步执行Step时会临时禁用所有中断以避免调试过程被中断干扰。你需要使用“运行到光标”或设置断点后全速运行的方式来调试中断行为。问题5清除中断状态后外设的标志位未清除。重要原则AINTC的SECRn/SICR操作只清除AINTC内部的中断状态位它并不会自动清除产生该中断的外设如UART、Timer内部的标志位。必须在你的C语言ISR中在处理完中断事件后手动清除外设的中断标志位。例如对于UART接收中断在读取数据后需要写UART的某个寄存器来清除“接收数据就绪”标志。如果只清了AINTC状态而忘了清外设标志退出ISR后该外设会立即再次触发中断导致中断风暴。调试技巧活用GPIR和GPVR寄存器。即使在向量化模式下GPIR寄存器也是一个强大的调试工具。你可以在任何地方例如在空ISR或默认异常处理中读取GPIR。如果其NONE位为0则PRI_INDX字段就告诉你当前挂起的最高优先级中断的索引号。这对于诊断“哪个中断导致了问题”非常有用。GPVR则可以帮你验证向量地址计算是否正确。