第2章:实时系统核心概念:硬实时与软实时的区别,RTOS选型对比

做视觉伺服控制,说白了就是跟时间赛跑。你想想看,相机采集到图像,算法算完控制量,再发给电机,这一圈下来如果超时了,那后果可能就是机器人撞墙、工件报废。所以,选对实时系统,是咱们这一行的基本功。

这一章,我就跟你聊聊实时系统的两个核心概念——硬实时和软实时,再对比一下市面上主流的几个RTOS。我个人习惯是,先搞清楚需求,再选工具,千万别反过来。

2.1 硬实时 vs 软实时:差之毫厘,谬以千里

很多刚入行的朋友觉得,实时嘛,就是快。其实不是。实时系统的核心是「确定性」——你得保证任务在规定的截止时间前完成,而不是单纯看平均响应速度有多快。

硬实时(Hard Real-Time)

硬实时系统要求:一旦错过截止时间,系统就算失败。我在项目中遇到过,有一次给工业机器人做力控,控制周期是1ms。如果某个周期没算完,电机就会抖一下,轻则划伤工件,重则损坏夹具。这就是典型的硬实时场景。

硬实时的典型特征:

  • 截止时间必须100%满足,不允许任何超时
  • 超时的后果是灾难性的(设备损坏、人身安全)
  • 需要严格的任务调度和资源管理

视觉伺服里的关节位置控制、力控、安全急停,这些都属于硬实时任务。嗯,这里要注意,硬实时不是说「永远不超时」,而是说「超时的概率必须低到可以忽略不计」。

软实时(Soft Real-Time)

软实时系统就宽松一些:偶尔超时没关系,但性能会下降。比如你做一个视觉跟踪的GUI显示,画面偶尔卡顿一下,用户能接受,只是体验差一点。

我的经验: 视觉伺服里,图像采集和预处理可以算软实时,但控制输出必须是硬实时。我曾经在一个项目里把图像处理和控制放在同一个线程里,结果图像处理偶尔抖动,控制也跟着抖。后来我把它们拆开,图像处理跑软实时,控制跑硬实时,问题就解决了。

对比维度 硬实时 软实时
截止时间要求 必须满足 尽量满足
超时后果 系统失败 性能下降
典型应用 电机控制、安全逻辑 图像显示、日志记录
调度策略 优先级抢占 + 时间触发 优先级抢占即可

2.2 RTOS选型:FreeRTOS、RT-Linux、Xenomai怎么选?

选RTOS,说白了就是看你的硬件平台、实时性要求、以及团队的技术栈。我这些年用过不少,下面说说我的真实感受。

FreeRTOS:轻量级,适合MCU

FreeRTOS是嵌入式领域的老牌RTOS了。它非常轻,内核只有几KB,适合跑在STM32这类MCU上。如果你做的是简单的视觉伺服——比如用摄像头做循迹小车,那FreeRTOS完全够用。

但要注意,FreeRTOS的实时性取决于你的硬件。它本身是硬实时的,但如果你用的MCU没有硬件浮点单元,那算起矩阵来就慢了。我曾经在一个项目里用FreeRTOS做四轴飞行器的姿态控制,控制周期跑到了2kHz,没问题。

避坑指南: 我曾经在FreeRTOS里用动态内存分配,结果任务创建多了,内存碎片导致系统崩溃。后来我改用静态分配,再也没出过问题。所以,在实时系统里,尽量别用malloc。

RT-Linux:Linux的实时补丁

RT-Linux是在标准Linux内核上打了一个实时补丁(PREEMPT_RT)。它的好处是你可以用Linux的生态——OpenCV、ROS、各种驱动。但代价是实时性不如裸跑RTOS。

RT-Linux适合做「软实时」或「弱硬实时」的视觉伺服。比如你用ROS做导航,控制周期在10ms左右,那RT-Linux就够用。但如果你要做1ms的力控,我建议你慎重。

我的建议: 如果你团队里都是Linux高手,而且你的视觉伺服对实时性要求不是极端苛刻,那RT-Linux是性价比最高的选择。毕竟,你不需要重新学一套RTOS的API。

Xenomai:双内核,硬实时

Xenomai走的是双内核路线——一个实时内核跑硬实时任务,一个Linux内核跑非实时任务。它的实时性比RT-Linux好很多,能做到微秒级的抖动。

我在做工业机器人视觉伺服时,用的就是Xenomai。控制周期500μs,抖动控制在±10μs以内。嗯,这个精度对于大多数视觉伺服来说,已经非常好了。

但Xenomai的缺点也很明显:配置复杂,驱动支持少。你想想看,你要给一个工业相机写Xenomai的驱动,那工作量可不小。

对比维度 FreeRTOS RT-Linux Xenomai
实时性 硬实时(μs级) 软实时(ms级) 硬实时(μs级)
硬件要求 MCU(低资源) MPU(ARM/x86) MPU(x86为主)
生态 强(Linux生态)
开发难度
典型场景 简单视觉伺服 ROS导航、视觉处理 工业机器人、力控

2.3 知识体系:实时系统选型逻辑

下面这张图,是我自己总结的选型逻辑。你照着这个思路走,基本不会选错。

实时系统选型逻辑 视觉伺服需求分析 控制周期 < 1ms? 硬实时需求 Xenomai / FreeRTOS 软实时需求 RT-Linux / Linux MCU资源受限? → FreeRTOS 需要Linux生态? → Xenomai 控制周期 > 10ms? → 标准Linux 需要确定性? → RT-Linux

2.4 我的选型建议

说了这么多,给你一个总结性的建议吧:

  • 如果你做的是嵌入式视觉伺服(比如STM32 + 摄像头),选FreeRTOS。轻、快、稳。
  • 如果你做的是机器人导航或移动抓取,控制周期在10ms左右,选RT-Linux。生态好,开发快。
  • 如果你做的是工业级力控或高速视觉伺服,控制周期在1ms以内,选Xenomai。虽然配置麻烦,但实时性有保障。

一个小技巧: 我习惯在项目初期先用标准Linux做原型验证,等算法稳定了,再移植到RTOS上。这样既能快速迭代,又能保证最终产品的实时性。

好了,这一章的内容就到这里。记住,选型没有绝对的对错,只有合不合适。下一章,我们会深入视觉伺服的实时调度策略,到时候再聊。


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