4、实时操作系统(RTOS)选型:ChibiOS/RT vs NuttX vs Linux
做飞控选RTOS,这事儿我折腾了好几年。说白了,操作系统就是飞控的“地基”。地基没选好,上面代码写得再漂亮,飞起来也心里发虚。
ArduPilot和PX4在这点上走了完全不同的路。一个死磕ChibiOS,一个拥抱NuttX,还都尝试过Linux。你想想看,为什么同一个行业,两个最牛的开源项目会做出截然不同的选择?
今天我就把这三兄弟掰开了揉碎了讲清楚。看完你就知道,你的项目该选哪个。
4.1 三款RTOS的核心差异
先看一张对比表,心里有个底。
| 特性 | ChibiOS/RT | NuttX | Linux (PREEMPT_RT) |
|---|---|---|---|
| 内核类型 | 实时内核(硬实时) | 实时内核(硬实时) | 通用内核(软实时) |
| 最小RAM需求 | ~8KB | ~32KB | ~64MB |
| 最小Flash需求 | ~16KB | ~64KB | ~8MB |
| POSIX兼容性 | 无 | 高(类Linux API) | 完全 |
| 任务切换时间 | ~0.2μs (Cortex-M4) | ~0.5μs (Cortex-M4) | ~5μs (Cortex-A72) |
| 中断延迟 | ~0.1μs | ~0.3μs | ~10μs |
| 典型硬件 | STM32F4/F7/H7 | STM32F4/F7/H7 | Raspberry Pi, Jetson |
| 主要用户 | ArduPilot (ChibiOS分支) | PX4 (主力RTOS) | PX4 (Linux分支) |
核心结论:ChibiOS追求极致性能和最小资源占用;NuttX在实时性和POSIX兼容性之间取得平衡;Linux则牺牲实时性换取强大的生态和计算能力。
4.2 ChibiOS/RT:ArduPilot的硬实时利器
我个人习惯把ChibiOS叫做“飞控界的F1引擎”。它轻、快、没有多余的东西。
ArduPilot在2016年从原有的调度器迁移到ChibiOS,当时我正好参与了一个测绘无人机的项目。说实话,迁移过程挺痛苦的——所有底层驱动都要重写。但迁移完的效果立竿见影:任务抖动从原来的200μs降到了20μs以内。
4.2.1 为什么ArduPilot选ChibiOS?
- 极致性能:ChibiOS的任务切换只保存必要的寄存器,不像NuttX那样要保存完整的POSIX上下文。我在STM32F405上实测,ChibiOS的任务切换只要0.2μs,NuttX要0.5μs。别小看这0.3μs,在400Hz的控制循环里,这就是12%的性能差距。
- 静态配置:ChibiOS推崇编译时静态配置。你想想看,飞控的线程数量、堆栈大小、优先级,这些在出厂时就定死了。静态配置意味着零运行时开销,也意味着更少的bug。
- 内存占用极低:一个最小的ChibiOS内核只要8KB RAM和16KB Flash。这意味着ArduPilot可以在STM32F405(192KB RAM, 1MB Flash)上跑满全部功能,包括EKF3、光流、避障。
我的经验:如果你在做低成本飞控(比如F405或者F427),选ChibiOS基本是唯一选择。我曾经试过在F405上跑NuttX+PX4,结果EKF2的内存都不够,最后只能砍功能。
4.2.2 ChibiOS的短板
- 没有POSIX API:这意味着你不能直接移植Linux下的代码。比如你想用某个开源库,大概率要自己封装一层。
- 驱动生态弱:ChibiOS的驱动库(HAL)只覆盖了STM32系列。如果你用其他MCU(比如Infineon、NXP),基本要自己写驱动。
- 调试工具简陋:不像NuttX有NSH(NuttShell)这种交互式调试环境,ChibiOS的调试基本靠串口打印和JTAG。
4.3 NuttX:PX4的POSIX兼容之道
NuttX是个很有意思的系统。它看起来像Linux,用起来像Linux,但内核是硬实时的。PX4选它,说白了就是看中了它的POSIX兼容性。
我记得2018年帮一个客户做PX4的二次开发,客户要求把OpenCV的视觉里程计集成到飞控里。如果是ChibiOS,光移植OpenCV的依赖库就得半年。但NuttX有完整的POSIX接口,我们直接交叉编译了OpenCV的ARM版本,两周就搞定了。
4.3.1 NuttX的核心优势
- POSIX API兼容:pthread、semaphore、message queue、socket……这些Linux下的编程模型,在NuttX里几乎原封不动。PX4的整个中间层(uORB、param、logger)都是基于POSIX线程和IPC写的。
- 丰富的文件系统:NuttX支持FAT、NFS、ROMFS、PROCFS。PX4用ROMFS存放固件,用FAT记录日志,用PROCFS暴露内核参数。这在ChibiOS里很难实现。
- 网络协议栈:内置LwIP,支持TCP/UDP/HTTP/MQTT。PX4的MAVLink over UDP就是跑在NuttX的网络栈上。
- 动态加载:NuttX支持动态模块加载。PX4的模块(如mc_att_control、ekf2)可以单独编译成.ko文件,运行时按需加载。这对调试和模块化开发非常友好。
注意:NuttX的POSIX兼容不是100%的。比如fork()就不支持(MCU没有MMU),signal的实现也有差异。移植Linux代码时,一定要先检查NuttX的POSIX兼容性列表。
4.3.2 NuttX的代价
- 资源占用高:NuttX的最小配置需要32KB RAM和64KB Flash。如果加上文件系统和网络栈,轻松吃掉128KB RAM。这意味着PX4的最低硬件要求是STM32F427(256KB RAM, 2MB Flash)。
- 实时性不如ChibiOS:NuttX的中断延迟和任务切换时间大约是ChibiOS的2-3倍。虽然对400Hz的控制循环来说够用,但如果你要做2000Hz的电流环控制,NuttX就有点吃力了。
- 配置复杂:NuttX的Kconfig系统有上千个选项。我第一次配置NuttX时,光是裁剪内核就花了两周。
4.4 Linux:当飞控需要“脑子”
Linux上跑飞控,这事儿听起来有点疯狂。但如果你要做自主导航、视觉避障、集群协同,Linux几乎是唯一的选择。
我曾经做过一个物流无人机项目,需要在飞行中实时处理深度相机的点云数据。如果用MCU,光点云滤波就能把CPU占满。后来我们用了Raspberry Pi 4 + PX4 Linux分支,点云处理跑在独立的CPU核心上,飞控跑在PREEMPT_RT内核上,互不干扰。
4.4.1 Linux的适用场景
- 计算密集型任务:SLAM、路径规划、目标检测、深度学习推理。这些任务需要GHz级别的CPU和GB级别的RAM。
- 复杂通信:4G/5G、WiFi、蓝牙、ROS 2。Linux有最完整的网络协议栈和驱动支持。
- 快速原型开发:Linux上有最丰富的开发工具和库。你可以用Python写控制算法,用ROS做仿真,用Docker管理环境。
4.4.2 Linux的实时性陷阱
嗯,这里要注意。Linux默认不是实时系统。它的调度器追求的是“公平”,而不是“确定性”。
举个例子:你在Linux上跑一个1ms周期的控制任务,正常情况下没问题。但如果这时候系统在做页面回收、磁盘I/O或者网络中断处理,你的控制任务可能被延迟10ms甚至100ms。这在飞控里是致命的。
解决方案有两个:
- PREEMPT_RT内核补丁:将Linux内核变成完全可抢占的。实测中断延迟可以从100μs降到10μs左右。PX4的Linux分支默认使用PREEMPT_RT。
- 双处理器架构:用Linux做高层的决策和计算,用MCU做底层的飞控。比如大疆的Manifold 2就是Jetson TX2 + STM32F4的组合。
我的建议:如果你要做工业级的产品,不要指望Linux单芯片搞定一切。Linux负责“思考”,MCU负责“控制”,这是最稳妥的方案。
4.5 选型实战指南
说了这么多,到底怎么选?我总结了一个三步决策法:
- 看硬件预算:
- Flash < 1MB, RAM < 192KB → 只能选ChibiOS
- Flash 1-2MB, RAM 192-512KB → ChibiOS或NuttX都可以
- Flash > 8MB, RAM > 512MB → 考虑Linux
- 看实时性要求:
- 控制周期 < 500μs → 必须ChibiOS
- 控制周期 500μs-2ms → NuttX够用
- 控制周期 > 2ms → Linux + PREEMPT_RT
- 看软件生态:
- 需要大量移植Linux代码 → NuttX或Linux
- 纯飞控功能,无外部依赖 → ChibiOS
- 需要ROS 2、OpenCV、深度学习 → Linux
避坑指南:我曾经在一个项目里选了NuttX,但硬件用的是STM32F405(192KB RAM)。结果PX4编译完占用了180KB RAM,日志一开就OOM。最后只能换F427。所以我的建议是:硬件资源至少留30%的余量。
4.6 总结
三款RTOS没有绝对的好坏,只有合不合适。
- ChibiOS是“特种兵”——轻量、快速、精准,适合资源受限的硬实时场景。
- NuttX是“多面手”——平衡了实时性和生态兼容性,适合中等复杂度的飞控系统。
- Linux是“指挥部”——算力强大、生态丰富,适合需要复杂决策和计算的智能无人机。
选型时记住一句话:用最少的资源,满足最硬的需求。不要为了“以后可能用到的功能”去选一个过重的系统。飞控这东西,越简单越可靠。