3、实时系统与RTOS:实时操作系统概念、任务调度与优先级、中断管理
做曝光机运动控制这些年,我越来越觉得——实时系统是整个控制链的“脊梁骨”。
你想想看,曝光机在高速运动时,光栅尺每微秒都在反馈位置,电机每毫秒都在调整扭矩。如果系统响应慢了半拍,轻则套刻精度跑偏,重则直接撞机。嗯,这不是开玩笑。
3.1 什么是实时系统?
实时系统,说白了就是“在规定时间内必须完成任务”的系统。
它跟普通Windows或Linux桌面系统最大的区别在于:确定性。普通系统你点个鼠标,可能几毫秒响应,也可能几百毫秒才动——这叫“软实时”。但在曝光机里,位置闭环控制周期必须是固定的,比如100微秒,差1微秒都不行。
实时系统的核心指标:
- 响应时间:从事件发生到系统开始处理的时间
- 截止时间:任务必须完成的最晚时刻
- 抖动:响应时间的波动范围,越小越好
我记得刚入行时,有个老工程师跟我说:“实时系统不是快,是可预测。” 当时不太理解,后来调试一台步进式曝光机,发现电机偶尔会“抖一下”。查了三天,原来是Windows的定时器被系统调度打断了,导致控制周期偶尔延迟到200微秒。从那以后,我再也不敢在运动控制上用通用操作系统了。
3.2 RTOS:实时操作系统的选择
RTOS(Real-Time Operating System)就是专门为实时场景设计的操作系统。常见的RTOS有:
| RTOS名称 | 特点 | 适用场景 |
|---|---|---|
| FreeRTOS | 开源、轻量、社区活跃 | 中小型嵌入式控制 |
| VxWorks | 商业级、高可靠性、硬实时 | 高端工业设备、航空航天 |
| RT-Thread | 国产、组件丰富、生态好 | 物联网、工业控制 |
| μC/OS-II/III | 经典、文档齐全、学习门槛低 | 教学、中小型项目 |
我个人习惯在曝光机运动控制上用VxWorks。为什么?因为它的中断响应时间可以做到微秒级,而且任务调度非常稳定。当然,成本也高——一套开发许可够买好几台工控机了。
我的建议:如果项目预算有限,FreeRTOS配合高性能MCU(比如Cortex-M7)也能满足大部分曝光机的需求。但如果你要做纳米级精度的光刻机,还是老老实实上VxWorks吧。
3.3 任务调度与优先级
RTOS的核心工作就是调度任务。曝光机里通常有多个任务同时运行:
- 位置闭环控制任务:最高优先级,周期100μs
- 速度前馈计算任务:次高优先级,周期500μs
- IO监控任务:中等优先级,周期1ms
- 人机界面通信任务:低优先级,周期10ms
- 日志记录任务:最低优先级,空闲时执行
为什么会这样安排?你想想看,位置闭环如果延迟了,电机就会失控。而日志记录晚几秒写进去,完全不影响设备运行。
RTOS常用的调度策略有两种:
- 优先级抢占式调度:高优先级任务随时可以打断低优先级任务。这是曝光机最常用的方式。
- 时间片轮转调度:同等优先级的任务轮流执行。一般用于非实时任务。
注意:优先级设置不是越高越好。我曾经在一个项目里把IO监控任务设得比控制任务还高,结果电机控制周期被IO中断频繁打断,导致运动曲线出现毛刺。后来花了整整一周才定位到问题。
3.4 中断管理
中断是RTOS响应外部事件的“快车道”。曝光机里常见的中断源包括:
- 光栅尺位置脉冲:每移动一个分辨率单位触发一次
- 限位开关信号:机械到达极限位置时触发
- 伺服驱动器报警:过流、过温、编码器故障等
- 定时器溢出:用于产生固定周期的控制节拍
中断处理的原则是:中断服务程序(ISR)要短、要快、要简单。ISR里只做最紧急的事,比如读取硬件寄存器、设置标志位。复杂的计算和逻辑处理,交给任务去完成。
// 一个典型的中断服务程序示例(伪代码)
void PositionInterruptHandler(void) {
// 1. 读取光栅尺当前位置
current_pos = ReadEncoder();
// 2. 计算位置误差
position_error = target_pos - current_pos;
// 3. 设置标志位,通知控制任务处理
g_position_update_flag = 1;
// 4. 清除中断标志
ClearInterruptFlag();
// 注意:这里不做PID计算,只做数据采集
}
我记得有一次调试,发现电机在高速运行时偶尔会“丢步”。查了很久,最后发现是ISR里做了太多浮点运算,导致中断响应时间过长,下一个中断来了还没处理完。嗯,从那以后我定了个规矩:ISR里绝对不做浮点运算,绝对不调用RTOS的延时函数。
3.5 实时系统的“坑”与避坑指南
做实时系统这么多年,我踩过的坑不少。这里分享几个典型的:
避坑指南:
- 优先级反转:低优先级任务占用资源,导致高优先级任务被阻塞。解决方案是使用优先级继承协议。
- 死锁:两个任务互相等待对方释放资源。我习惯用“资源分级法”——所有任务按固定顺序申请资源。
- 中断嵌套过深:高优先级中断打断低优先级中断,导致栈溢出。建议限制中断嵌套层数不超过3层。
- 任务栈溢出:任务局部变量太多或递归调用过深。我一般在每个任务里加一个“栈水印”,定期检查。
我曾经在一个项目中,因为没处理好优先级反转,导致曝光机在高速扫描时突然“卡顿”了一下,整批晶圆全部报废。那次教训太深刻了——实时系统的每一个细节,都可能决定设备的成败。
3.6 本章知识体系
下面这张图是我自己整理的实时系统知识框架,方便你快速回顾:
好了,这一章的内容就到这里。实时系统是曝光机运动控制的“地基”,地基不稳,上面盖再漂亮的房子也没用。希望你能把这些概念真正吃透,而不是停留在“听过”的层面。
公众号:蓝海资料掘金营,微信deep3321