4. RH850中断系统

在RH850实时系统中,中断是连接外设事件与CPU处理的核心机制。无论是CAN报文到达、定时器溢出、ADC转换完成,还是GPIO边沿触发,最终都要通过中断控制器进入CPU,由中断服务程序完成响应。理解RH850中断系统,不能只停留在“会写中断函数”的层面,而要掌握中断源分类、优先级仲裁、向量表定位、嵌套规则以及延迟构成,这些直接决定系统的实时性与确定性。

一、中断源与中断控制器结构

RH850的中断源大致分为三类:外部中断、内部外设中断和异常。外部中断来自INTP引脚或外部中断控制器;内部外设中断来自定时器、串口、CAN、ADC、DMA等片上外设;异常则包括复位、非法指令、访问异常等。所有外设中断通常先汇聚到中断控制器(INTC),再由INTC向CPU核发出中断请求。

RH850的INTC支持多级优先级配置,每个中断源可分配0~31级优先级(具体范围依型号而定)。优先级数值越大,级别越高。当多个中断同时到达时,INTC根据优先级和通道号进行仲裁,选出最高优先级请求提交给CPU。若优先级相同,则按硬件通道号顺序决定,这一点在实时分析中非常关键,因为相同优先级的中断响应顺序并非完全由软件控制。

RH850中断系统的核心链路可概括为:外设事件 → 中断标志置位 → INTC仲裁 → CPU取中断 → 向量表跳转 → ISR执行 → 清标志/返回。
RH850中断系统结构示意 外部中断源 INTP / GPIO边沿 内部外设中断 TAUJ / CAN / ADC 异常与复位 非法指令 / 访问异常 中断控制器 INTC 优先级仲裁 中断屏蔽 通道选择 请求锁存 CPU核 取中断 保存现场 跳转向量 执行ISR 中断向量表 入口地址 优先级配置 ISR入口 返回指令 中断请求经INTC仲裁后送入CPU,CPU依据向量表跳转到对应ISR

二、优先级机制与嵌套中断

RH850支持中断嵌套,即高优先级中断可以打断正在执行的低优先级ISR。是否允许嵌套,取决于当前PSW中的中断屏蔽位和INTC的优先级比较逻辑。通常,当CPU进入某中断后,会自动屏蔽同级及更低优先级中断,只有更高优先级请求才能再次触发中断。

嵌套中断带来两个直接后果:一是提高紧急事件的响应速度,二是增加栈深度和现场保存开销。如果嵌套层数过深,可能导致栈溢出或任务抖动。因此,在工程中需要为每个中断源分配合理优先级,并限制最大嵌套层数。例如,将电机控制PWM中断设为最高优先级,CAN接收设为中优先级,调试串口设为低优先级。

中断源 典型优先级 是否允许嵌套 实时性要求
PWM周期中断31可打断低优先级极高,微秒级
CAN接收中断20可被PWM打断高,毫秒级
ADC转换完成15可被高优先级打断中高
调试串口接收5通常不嵌套低,可容忍延迟

三、中断向量表与响应流程

中断向量表是中断系统的“地址地图”。每个中断源对应一个向量入口,CPU收到中断后,根据中断号从向量表中取出ISR入口地址并跳转。RH850的向量表通常位于固定内存区域,也可通过寄存器重定位。向量表中不仅包含入口地址,还可能包含优先级和中断屏蔽信息。

一个典型的中断响应流程如下:外设置位中断标志,INTC锁存请求并仲裁,CPU完成当前指令后响应中断,保存PC和PSW,关闭同级中断,从向量表取入口地址,执行ISR,最后执行中断返回指令恢复现场。整个过程的时间开销就是中断延迟的主要来源。

/* RH850中断向量表片段示意 */
#pragma section ".intvec" 
void (* const InterruptVector[])(void) = {
    (void (*)(void))0x00000000,   /* 复位 */
    (void (*)(void))0x00001000,   /* NMI */
    (void (*)(void))0x00002000,   /* INTP0 */
    (void (*)(void))0x00003000,   /* TAUJ0 */
    (void (*)(void))0x00004000,   /* CAN0 */
};
#pragma section

四、中断延迟与响应时间分析

中断延迟是指从中断事件发生到ISR第一条指令执行之间的时间。它通常由四部分组成:外设同步与标志置位时间、INTC仲裁时间、CPU完成当前指令的时间、现场保存与向量跳转时间。中断响应时间则还包括ISR本身的执行时间,直到完成关键操作。

在实时分析中,最坏情况中断延迟(WCIL)是核心指标。它取决于最长不可中断指令、当前中断屏蔽状态、INTC仲裁延迟以及总线访问等待。例如,若CPU正在执行一条长除法指令,且该指令不可中断,则中断响应必须等待其完成。因此,在硬实时场景中,应避免在中断关键路径上执行长指令,并尽量缩短ISR。

常见误区:认为“中断优先级越高,响应一定越快”。实际上,如果高优先级中断被全局屏蔽,或者INTC仲裁被低优先级请求占用,响应仍会延迟。优先级只决定仲裁顺序,不决定屏蔽状态。

五、工程案例与复盘

某电机控制项目中,PWM中断负责电流环计算,CAN中断负责接收上位机指令。初期将CAN优先级设得过高,导致PWM中断偶尔被CAN接收打断,电流环出现抖动。复盘后发现,CAN报文虽然重要,但电流环的周期确定性更关键。调整方案是将PWM设为最高优先级,CAN降为中等优先级,并在CAN ISR中只做数据搬运,将解析工作放到任务中执行。调整后,电流环抖动消失,CAN响应仍在可接受范围内。

另一个常见问题是中断标志未清除。RH850部分外设要求“先读状态寄存器,再清标志”,若顺序错误,中断会反复触发,表现为系统频繁进入ISR,CPU占用率飙升。排查时应先确认标志清除序列,再检查INTC屏蔽位和优先级配置。

中断系统调优建议:1)为每个中断源明确优先级和最大嵌套层数;2)ISR尽量短小,只做标志清除、数据搬运和事件通知;3)使用示波器或GPIO翻转测量中断延迟;4)定期检查栈使用量,防止嵌套导致溢出。

总结来看,RH850中断系统的核心在于“源—仲裁—向量—嵌套—延迟”这条链路。只有把优先级、向量表和延迟构成放在一起分析,才能设计出既满足实时性又稳定的中断架构。