实时系统基础:硬实时与软实时、RTOS选型、任务优先级与调度策略
做运动控制这些年,我踩过最大的坑,就是低估了实时系统的重要性。
记得刚入行那会儿,我接手一个六轴机械臂项目。代码写得很顺,逻辑也没问题,可一跑起来,关节就抖得跟筛糠似的。查了三天,最后发现是任务调度出了岔子——一个非关键任务把CPU时间吃掉了,导致伺服控制周期从1ms跳到了3ms。嗯,从那以后,我再也不敢轻视实时系统的基础知识了。
硬实时 vs 软实时:差之毫厘,谬以千里
先说说这两个概念。你想想看,运动控制里,有些任务晚1ms就是灾难,有些任务晚100ms也无伤大雅。这就是硬实时和软实时的本质区别。
硬实时系统:截止时间必须满足,否则系统崩溃或造成严重后果。
- 典型场景:伺服驱动器的电流环控制、安全急停逻辑
- 延迟容忍度:微秒级,超过即失败
- 我见过最严苛的:某高速贴片机,位置环必须在50μs内完成,超了就撞机
软实时系统:截止时间可以偶尔错过,性能下降但不会崩溃。
- 典型场景:人机界面刷新、日志记录、非关键通信
- 延迟容忍度:毫秒级,偶尔超时问题不大
- 说白了,你按个按钮界面晚100ms刷新,用户顶多觉得卡,不会出事故
核心判断标准:错过截止时间的后果是什么?
如果后果是「机器报废」或「人员受伤」,那就是硬实时。
如果后果是「用户体验差一点」,那就是软实时。
我曾经犯过的错:把软实时的任务和硬实时的任务混在一个线程里跑。结果日志打印时触发了文件系统阻塞,硬实时任务直接超时。后来我学乖了——硬实时和软实时必须物理隔离,要么分CPU核,要么分不同优先级的中断。
RTOS选型:别只看参数,要看生态
市面上RTOS一大堆,FreeRTOS、RT-Thread、VxWorks、QNX……怎么选?我个人习惯从三个维度看:
| 维度 | 说明 | 我的经验 |
|---|---|---|
| 实时性 | 中断响应时间、任务切换时间 | 运动控制至少需要μs级响应,FreeRTOS在Cortex-M上能做到1μs以内 |
| 确定性 | 最坏情况执行时间是否可预测 | VxWorks的确定性最好,但贵。RT-Thread在国产芯片上表现不错 |
| 生态 | 驱动库、中间件、社区支持 | FreeRTOS生态最广,但运动控制专用组件少。RT-Thread有电机驱动框架 |
我建议中小型运动控制项目优先考虑FreeRTOS或RT-Thread。为什么?
- FreeRTOS:轻量、稳定、资料多。我最早的项目就是用FreeRTOS做的,踩坑少
- RT-Thread:国产、组件丰富、有设备驱动框架。最近几个项目我都转过去了
一个小技巧:选型时别只看benchmark。去社区看看别人在运动控制场景下的实际反馈。我记得有一次选型,参数上A系统比B系统快30%,但实际跑起来A系统在中断嵌套时频繁丢任务——这种坑,参数表上看不出来。
任务优先级与调度策略:别让高优先级饿死低优先级
这部分是运动控制的核心。你想想看,一个运动控制系统里,任务优先级怎么排?
我一般这样排:
- 最高优先级:电流环/位置环中断服务(硬实时,μs级)
- 高优先级:速度规划、轨迹插补(硬实时,ms级)
- 中优先级:通信处理、状态机管理(软实时,10ms级)
- 低优先级:日志、界面刷新、参数配置(非实时)
调度策略上,主流RTOS都支持两种:
优先级抢占式调度:高优先级任务就绪时,立即抢占低优先级任务。
- 优点:实时性好,关键任务能及时响应
- 缺点:优先级反转问题需要处理
时间片轮转调度:同优先级任务轮流执行固定时间片。
- 优点:公平,不会饿死
- 缺点:实时性差,不适合硬实时任务
我的建议:运动控制中,硬实时任务用优先级抢占,软实时任务用时间片轮转。混合使用效果最好。
这里有个经典问题——优先级反转。高优先级任务等一个资源,资源被低优先级任务占着,中优先级任务又抢了CPU,导致高优先级任务迟迟拿不到资源。
解决办法?我常用三种:
- 优先级继承:低优先级任务临时提升到高优先级,快速释放资源
- 优先级天花板:任务获取资源时,优先级直接提到最高
- 关中断:短临界区直接关中断,简单粗暴但有效
我曾经踩过的坑:在一个四轴机器人项目里,我用了信号量保护共享数据,结果三个任务互相等,系统直接死锁。后来改用消息队列+无锁编程,问题才解决。记住:运动控制里,能不用锁就不用锁,能用原子操作就别用信号量。
知识体系总览
下面这张图,是我自己总结的实时系统在运动控制中的知识框架。你看一眼,心里就有数了。
这张图把实时分类、RTOS选型、调度策略和常见问题串起来了。你照着这个框架去学,不会乱。
最后说一句:实时系统这东西,光看书没用。我建议你找个开发板,跑一个简单的运动控制Demo——比如控制一个直流电机做位置闭环。把任务优先级调一调,看看实际效果。亲手踩过坑,比看十遍书都管用。
公众号:蓝海资料掘金营,微信deep3321