第4章 中断系统深入:中断优先级、中断嵌套、中断向量表配置,以及运动控制中的实时响应需求

各位同学,咱们今天聊聊中断系统。说实话,做运动控制,中断就是你的命根子。没有好的中断管理,你的电机跑起来就像喝醉了酒——抖得厉害。我见过不少工程师,算法写得漂亮,但一上硬件就崩,十有八九是中断没玩明白。

4.1 中断优先级:谁先说话谁有理

中断优先级,说白了就是给每个中断源排个队。AURIX 的中断优先级有 255 级,0 最高,255 最低。嗯,这里要注意:优先级数字越小,紧急程度越高。

我在项目中遇到过一个问题:两个中断同时触发,结果系统死锁了。查了半天,发现是优先级设置反了——本该先处理的位置环,反而被电流环抢了先。

核心原则:

  • 电流环中断:优先级最高(建议 0-10)
  • 速度环中断:次高(建议 11-30)
  • 位置环中断:中等(建议 31-50)
  • 通信中断:较低(建议 51-100)
  • 后台任务:最低(建议 200+)

你想想看,电流环如果被耽误了,电机电流失控,轻则抖动,重则炸管。所以电流环必须是最高的。

4.2 中断嵌套:打断别人要讲规矩

中断嵌套,就是高优先级中断可以打断低优先级中断。AURIX 支持硬件自动嵌套,但你要小心——嵌套太深,栈会爆。

我曾经在一个伺服驱动项目里,嵌套了 5 层中断。结果呢?栈溢出,程序跑飞。从那以后,我给自己定了个规矩:嵌套不超过 3 层。

我的经验:

  • 电流环中断里不要开其他中断——它自己就是老大
  • 速度环中断里可以开电流环,但关掉其他
  • 位置环中断里可以开速度环和电流环
  • 通信中断里尽量别开运动控制中断

为什么这样设计?因为电流环的实时性要求最高,它必须独占 CPU。你想想看,电流采样周期只有几十微秒,中间插个别的活,采样就晚了。

4.3 中断向量表配置:你的中断地图

中断向量表,就是一张地图,告诉 CPU 每个中断来了该去哪找处理函数。AURIX 的向量表可以重定位,这给了我们很大的灵活性。

配置代码示例:

/* 中断向量表基地址配置 */
#define INT_VECTOR_BASE    0x80000000

/* 配置中断服务函数入口 */
void Interrupt_Config(void)
{
    /* 设置中断向量表基地址 */
    __asm__ volatile ("mtcr 0xFE1C, %0" : : "r"(INT_VECTOR_BASE));
    
    /* 配置具体中断向量 */
    /* 电流环中断 - 优先级0 */
    InstallInterruptHandler(CurrentLoop_ISR, 0, 0);
    
    /* 速度环中断 - 优先级20 */
    InstallInterruptHandler(SpeedLoop_ISR, 1, 20);
    
    /* 位置环中断 - 优先级40 */
    InstallInterruptHandler(PositionLoop_ISR, 2, 40);
    
    /* 使能全局中断 */
    __asm__ volatile ("enable");
}

嗯,这里要注意:向量表地址必须 256 字节对齐。我刚开始做的时候没注意这个,结果中断一触发就跑飞了。查了两天才发现是地址没对齐。

避坑指南:

  • 向量表地址必须 256 字节对齐
  • 每个中断向量占 4 字节(32 位地址)
  • 中断服务函数必须是短函数(尽量在 100 条指令内)
  • 不要在中断里调用 printf 等重函数

4.4 运动控制中的实时响应需求

做运动控制,实时性就是生命。我给大家列个表,看看不同控制环的实时要求:

控制环 典型周期 最大允许延迟 中断优先级
电流环 10-50 μs 5 μs 0-10
速度环 100-500 μs 50 μs 11-30
位置环 500 μs - 2 ms 200 μs 31-50
通信 1-10 ms 1 ms 51-100

你看这个表,电流环的周期只有 10-50 微秒。这意味着什么?意味着你的中断服务函数必须在 5 微秒内完成。否则下一个中断来了,你还在忙,那就出事了。

我个人的习惯是:电流环中断里只做最核心的事——读 ADC、算电流、写 PWM。其他什么滤波、诊断、通信,统统放到后台去。

实时响应设计要点:

  1. 中断服务函数要短:能放主循环的别放中断
  2. 使用双缓冲:ADC 数据用 ping-pong buffer
  3. 避免浮点运算:定点数运算更快
  4. 查表代替计算:三角函数、反正切等预先算好
  5. 关中断时间要短:关中断不要超过 1 μs

我记得有一次,一个同事把低通滤波放在了电流环中断里。结果呢?一个滤波算了 20 微秒,电流环周期直接翻倍。电机抖得像筛子一样。后来我帮他改成了滑动平均,用移位代替除法,时间降到了 2 微秒。

4.5 中断系统的整体架构

下面我用一张图来展示整个中断系统的架构。这张图是我自己画的,你看完就能明白各个部分怎么配合。

AURIX 运动控制中断系统架构 中断源层 电流采样 编码器 霍尔传感器 通信接口 故障检测 中断控制器层 优先级仲裁 嵌套管理 向量表查找 中断服务层 电流环 ISR 速度环 ISR 位置环 ISR 通信 ISR 应用层(主循环 + 后台任务) 中断优先级:电流环 > 速度环 > 位置环 > 通信 > 后台任务

这张图很清楚地展示了:中断源产生事件,中断控制器根据优先级决定谁先处理,然后跳转到对应的 ISR,最后回到主循环。每一层都有它的职责,不能乱。

我的建议:

刚开始做运动控制的朋友,先把电流环中断调通。电流环稳了,速度和位置才有意义。我曾经见过一个团队,花了两周调位置环,结果发现电流环的采样时序都是错的——白干。

好了,中断系统这块就讲到这里。记住一句话:中断优先级是你的命,向量表配置是你的地图,实时响应是你的底线。这三样玩明白了,运动控制就成功了一半。

本章核心要点:

  • 中断优先级:电流环最高,后台最低
  • 中断嵌套:不超过 3 层,电流环独占
  • 向量表配置:256 字节对齐,ISR 要短
  • 实时响应:电流环 5 μs 内必须完成

公众号:蓝海资料掘金营,微信deep3321