4、实时操作系统(RTOS)选型:ChibiOS/RT vs NuttX vs Linux

做飞控选RTOS,这事儿我折腾了好几年。说白了,操作系统就是飞控的“地基”。地基没选好,上面代码写得再漂亮,飞起来也心里发虚。

ArduPilot和PX4在这点上走了完全不同的路。一个死磕ChibiOS,一个拥抱NuttX,还都尝试过Linux。你想想看,为什么同一个行业,两个最牛的开源项目会做出截然不同的选择?

今天我就把这三兄弟掰开了揉碎了讲清楚。看完你就知道,你的项目该选哪个。

RTOS 选型决策树 飞控硬件平台 MCU (STM32F4/F7/H7) MPU (Raspberry Pi/ Jetson) ChibiOS/RT NuttX Linux (PREEMPT_RT) MCU 场景特点 • 资源受限:Flash < 2MB, RAM < 512KB • 硬实时要求:任务抖动 < 50μs • 外设直接操作:SPI/I2C/UART/DMA • 典型选型:ChibiOS 或 NuttX • 我建议:资源紧张选 ChibiOS, POSIX 需求多选 NuttX MPU 场景特点 • 资源丰富:Flash > 8GB, RAM > 1GB • 软实时为主:任务抖动 < 1ms • 复杂算法:CV、深度学习、SLAM • 典型选型:Linux + PREEMPT_RT • 我建议:需要生态选 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 选型实战指南

说了这么多,到底怎么选?我总结了一个三步决策法:

  1. 看硬件预算:
    • Flash < 1MB, RAM < 192KB → 只能选ChibiOS
    • Flash 1-2MB, RAM 192-512KB → ChibiOS或NuttX都可以
    • Flash > 8MB, RAM > 512MB → 考虑Linux
  2. 看实时性要求:
    • 控制周期 < 500μs → 必须ChibiOS
    • 控制周期 500μs-2ms → NuttX够用
    • 控制周期 > 2ms → Linux + PREEMPT_RT
  3. 看软件生态:
    • 需要大量移植Linux代码 → NuttX或Linux
    • 纯飞控功能,无外部依赖 → ChibiOS
    • 需要ROS 2、OpenCV、深度学习 → Linux

避坑指南:我曾经在一个项目里选了NuttX,但硬件用的是STM32F405(192KB RAM)。结果PX4编译完占用了180KB RAM,日志一开就OOM。最后只能换F427。所以我的建议是:硬件资源至少留30%的余量。

4.6 总结

三款RTOS没有绝对的好坏,只有合不合适。

  • ChibiOS是“特种兵”——轻量、快速、精准,适合资源受限的硬实时场景。
  • NuttX是“多面手”——平衡了实时性和生态兼容性,适合中等复杂度的飞控系统。
  • Linux是“指挥部”——算力强大、生态丰富,适合需要复杂决策和计算的智能无人机。

选型时记住一句话:用最少的资源,满足最硬的需求。不要为了“以后可能用到的功能”去选一个过重的系统。飞控这东西,越简单越可靠。