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常用的调度策略有两种:

  1. 优先级抢占式调度:高优先级任务随时可以打断低优先级任务。这是曝光机最常用的方式。
  2. 时间片轮转调度:同等优先级的任务轮流执行。一般用于非实时任务。

注意:优先级设置不是越高越好。我曾经在一个项目里把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 本章知识体系

下面这张图是我自己整理的实时系统知识框架,方便你快速回顾:

实时系统与RTOS 实时系统概念 • 确定性 • 响应时间 • 截止时间 • 抖动 RTOS选择 • FreeRTOS • VxWorks • RT-Thread • μC/OS 任务调度与优先级 • 优先级抢占 • 时间片轮转 • 优先级反转 • 死锁 中断管理 • 中断源 • ISR设计原则 • 中断嵌套 避坑指南 • 优先级反转 • 死锁 • 中断嵌套过深 • 任务栈溢出 核心:确定性 + 可预测性

好了,这一章的内容就到这里。实时系统是曝光机运动控制的“地基”,地基不稳,上面盖再漂亮的房子也没用。希望你能把这些概念真正吃透,而不是停留在“听过”的层面。


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