第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。其他什么滤波、诊断、通信,统统放到后台去。
实时响应设计要点:
- 中断服务函数要短:能放主循环的别放中断
- 使用双缓冲:ADC 数据用 ping-pong buffer
- 避免浮点运算:定点数运算更快
- 查表代替计算:三角函数、反正切等预先算好
- 关中断时间要短:关中断不要超过 1 μs
我记得有一次,一个同事把低通滤波放在了电流环中断里。结果呢?一个滤波算了 20 微秒,电流环周期直接翻倍。电机抖得像筛子一样。后来我帮他改成了滑动平均,用移位代替除法,时间降到了 2 微秒。
4.5 中断系统的整体架构
下面我用一张图来展示整个中断系统的架构。这张图是我自己画的,你看完就能明白各个部分怎么配合。
这张图很清楚地展示了:中断源产生事件,中断控制器根据优先级决定谁先处理,然后跳转到对应的 ISR,最后回到主循环。每一层都有它的职责,不能乱。
我的建议:
刚开始做运动控制的朋友,先把电流环中断调通。电流环稳了,速度和位置才有意义。我曾经见过一个团队,花了两周调位置环,结果发现电流环的采样时序都是错的——白干。
好了,中断系统这块就讲到这里。记住一句话:中断优先级是你的命,向量表配置是你的地图,实时响应是你的底线。这三样玩明白了,运动控制就成功了一半。
本章核心要点:
- 中断优先级:电流环最高,后台最低
- 中断嵌套:不超过 3 层,电流环独占
- 向量表配置:256 字节对齐,ISR 要短
- 实时响应:电流环 5 μs 内必须完成
公众号:蓝海资料掘金营,微信deep3321