一、NuttX RTOS的发展历程:从个人项目到Apache顶级开源项目
NuttX 是一款轻量级、可扩展的实时操作系统(RTOS),其发展历程堪称开源社区的经典案例。
- 起源与初创(2003-2007)
NuttX 由 Gregory Nutt 于2003年启动开发,最初目标是设计一款符合 POSIX/ANSI 标准 的嵌入式操作系统,以满足复杂设备的实时性需求。早期的NuttX以“微型Linux”为愿景,强调对标准接口的支持。 - 开源与社区化(2007-2016)
2007年,NuttX正式开源,吸引了嵌入式开发者的关注。其独特的 模块化架构 和 多平台支持 逐渐在工业控制、消费电子等领域崭露头角。 - Apache孵化与腾飞(2016至今)
2015年NuttX被三星选为TizenRT操作系统的内核,这进一步提升了它在行业内的知名度,2016年NuttX加入 Apache软件基金会(ASF) 孵化器,2019年在小米的推动下NuttX正式进入Apache基金会并很快在2020年成为Apache顶级项目。这一阶段,NuttX获得了企业级开发流程的支持,代码质量、社区协作、商业化应用和生态建设显著提升,成为嵌入式领域的重要玩家。
附上NuttX RTOS缔造者Gregory Nutt个人简历
- Embedded Firmware Development. 33 years experience leading the specification, design, and implementation of complex embedded systems for commercial and aerospace applications. Special emphasis on firmware architecture, hardware/firmware integration, operating systems, embedded Linux, C/C++, STL, multimedia, object-based developments, laser printers, signal processing applications.
- Embedded Linux/NuttX Contracting. Board Support Packages (BSPs), GNU tool chain, Digital Signal Processors (DSPs), embedded Linux, DTV, handheld, digital cinema, multimedia players, set-top boxes, barcode scanners.
- Project Management Successfully managed large, complex development efforts.
https://nuttx.apache.org/
二、NuttX的独特特性:为何开发者选择它?
NuttX在众多RTOS中脱颖而出,得益于其 兼容性、灵活性、标准化 的核心理念:
完全兼容POSIX/ANSI标准
- 支持标准API(如
pthread
、open/read/write
),开发者可无缝移植Linux应用代码,降低学习成本。 - 提供完整的文件系统(VFS、FAT、NFS)、网络协议栈(TCP/IP、IPv6、802.15.4)和Shell环境(NuttShell),功能接近Linux。
- 支持标准API(如
极致可伸缩性
- 内存占用从 2KB(裸机调度)到数MB(全功能配置) 灵活适配,覆盖从8位MCU到64位处理器的广泛硬件。
- 模块化设计允许通过
menuconfig
工具按需裁剪组件,避免资源浪费。
多平台与多架构支持
- 支持 ARM Cortex-M/A、ARM64、RISC-V、x86、Xtensa、MIPS 等主流架构,覆盖ESP32、STM32、Raspberry Pi等硬件平台。
- 提供硬件抽象层(HAL),简化移植流程。
硬实时与混合调度能力
- 基于优先级的抢占式调度,中断延迟低至 微秒级,满足硬实时需求。
- 支持 轮转调度(Round-Robin) 和 优先级继承协议,防止优先级反转。
支持多种类型文件系统与丰富的驱动模型
集成USB、CAN、I2C、SPI、UART、I3C、以太网、LCD framebuffer等外设驱动框架,提供 BSD Socket 网络接口。
支持 OpenAMP 多核通信框架,适应异构计算场景。
支持 VFS、FAT、NXFFS、ROMFS、Smart FS、PROCFS等。
支持EventFD、TimerFD、SignalFD
强大的网络协议栈支持
- 协议支持丰富:支持多种网络协议,包括IPv4、IPv6、TCP/IP、UDP、ARP、ICMP、ICMPv6、IGMPv2等,能满足不同网络应用场景的需求,无论是简单的设备联网还是复杂的网络通信功能都可实现。
- 套接字接口丰富:提供流、数据报和原始数据包套接字,支持多种地址族,如IPv4/IPv6(AF_INET,AF_INET6)、原始套接字(AF_PACKET)、原始IEEE 802.15.4(AF_IEEE802154)、原始蓝牙(AF_BLUETOOTH)和本地Unix域套接字(AF_LOCAL)等,还包括特殊的INET协议套接字,如原始ICMP和ICMPv6协议ping套接字(IPPROTO_ICMP,IPPROTO_ICMP6),为开发者提供了灵活多样的网络编程接口。
- 功能全面:具备IP转发、DNS名称解析、BSD兼容套接字层等功能,还提供网络实用程序,如DHCP服务器和客户端、SMTP客户端、TELNET服务器和客户端、FTP服务器和客户端、TFTP客户端、HTTP服务器和客户端、NTP客户端等,此外,还支持ICMPv6自主自动配置、NFS客户端网络文件系统(NFS,版本3,UDP)的支持以及PHY链接状态管理、XML RPC服务器等,能一站式满足网络通信和应用的多种需求。
- 可扩展性好:支持网络模块,如ESP8266等,方便开发者根据具体需求扩展网络功能,适应不同的硬件平台和应用场景,便于在各种嵌入式设备上构建网络应用。
三、开源社区的拥抱:企业与开发者的双重助力
NuttX的开源模式使其迅速获得全球开发者与企业的青睐,形成活跃的生态系统:
社区贡献与协作
- Apache基金会治理下,代码贡献者超过 300人,提交数逾 5万次,GitHub仓库活跃度稳居RTOS前列。
- 社区维护详尽的文档和示例,如 NuttX Apps 仓库提供传感器、通信、AI等应用模板。
企业级应用案例
- 索尼:在多款数码产品中使用NuttX管理硬件控制任务,借助其POSIX兼容性简化开发。
- 小米:将NuttX用于智能家居设备的实时控制模块,缩短产品上市周期。
- Fibit:最近两代手环都是基于NuttX进行开发。
- Atmel/Microchip:通过提供支持为SAMV7、SAME5、SAMD2L2、SAMA5、SAM34等MCU/MPU加入NuttX支持。
- NXP:为i.MX RT系列MCU提供官方NuttX支持,强化工控领域布局。
- Linux基金会:将NuttX纳入 Zephyr项目 的参考对比,推动行业标准化。
商业支持与工具链
- 企业如 Samsung、Google 通过赞助或代码回馈参与生态建设。
- 工具厂商提供专用调试插件(如Eclipse插件)和性能分析工具。
企业级应用案例补充
- SONY
- SONY Presentation in Linux Foundation Conference in 2016 - 基于NuttX开发
- SONY Presentation in Linux Foundation Conference in 2016 - 基于NuttX开发
- SONY基于NuttX RTOS的Spresense SDK开发指南
Spresense SDK 是用于控制上述硬件的软件。 Spresense SDK 使用RTOS之一的 NuttX 作为OS,并提供了详细的功能以基于该OS发挥 CXD5602 的性能。 Spresense 的每个驱动程序都是根据类似于Linux的 NuttX 的驱动程序框架以及 Spresense 的Audio,GNSS,ASMP等中间件层在驱动程序层之上实现的。
https://developer.sony.com/spresense/development-guides/sdk_developer_guide_zh.html
- 小米Vela
Xiaomi Vela 是小米基于开源实时操作系统 NuttX 打造的物联网嵌入式软件平台,Vela 在各种物联网
硬件平台上提供统一的软件服务,支持丰富的组件和易用的框架,打通碎片化的物联网应用场景。
https://iot.mi.com/vela
openvela 简介
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
Vela 的命名源自拉丁语中船帆的含义,也是南方星空中船帆星座的名字。我们选择这个名字的意义是希望与开发者一道携手,共同踏上星辰大海的征途。
openvela 技术优势
高度可扩展:openvela 的设计注重模块化与可扩展性,使其能够灵活适应多样的物联网应用场景。小到仅配备 32K RAM 的微型 BLE 模组,大到拥有 256M RAM 的智能有屏音箱,openvela 都能提供高度可扩展的支持。
一站式解决方案:随着时间的推移,openvela 不断沉淀了各类 AIoT 应用的共性需求,成为一个功能完备的软件平台,为各类物联网解决方案提供了全面的支持。厂商采用 openvela,可以显著降低研发成本并加速产品的上市时间。
成熟的异构计算支持:openvela 为异构多核系统提供了强大的支持,实现了 MCU、MPU、DSP、GPU 以及 NPU 等不同处理单元间无缝的 IPC 通信机制。此外,openvela 还提供了一个高级的 RPC 框架,简化了 openvela 与 Android 和 Linux 系统的通信,使快速打造一个异构融合操作系统成为可能。
标准兼容和高可移植性:openvela 内核基于 Apache NuttX ,这个被称为 “Tiny Linux” 的系统为 openvela 提供了高标准的 POSIX 兼容性。通过持续提升其 POSIX 兼容性,openvela 当前已达到 88% 的兼容水平。这种高标准的兼容性意味着在其他标准操作系统(例如 Linux)上开发的软件可以轻松迁移到 openvela,几乎不需要额外的工作。
全面的连接套件:openvela 提供了广泛的协议支持,包括蓝牙 BR/EDR/LE、LE Mesh、WiFi、Matter、LTE Cat1、以太网、CAN/LIN 等。同时,它还能与小米的 HyperConnect 协议无缝集成,提供了强大的连接能力。
丰富的开发者工具:openvela 提供了一系列完备的开发者工具,包括系统监控、性能分析、调试器、追踪、崩溃分析和日志分析工具,为开发者提供了强大的支持。
- 三星TizenRT
Tizen has been commercialized in smart TV, smartphone, wearable devices (Gear S, Gear Fit), and smart home appliances. However, low-end and low-cost IoT devices, such as home appliances without display and wearable bands with a small LCD, have received less attention. The goal of TizenRT is to extend the Tizen platform device coverage to these kind of low-end devices. TizenRT is an RTOS-based lightweight platform fitting in these devices, which are typically equipped with Cortex-M/R processors with MPU, less than 2 MB RAM, and less than 16 MB Flash.
Tizen 已成功商业化应用于智能电视、智能手机、可穿戴设备(如 Gear S、Gear Fit)以及智能家电等产品中。然而,诸如无显示屏的家电、配备小尺寸 LCD 的可穿戴手环这类低端、低成本物联网设备,此前并未得到 Tizen 足够的关注。TizenRT的目标,便是将Tizen平台的设备覆盖范围延伸至这些低端设备。它是一款基于实时操作系统(RTOS)的轻量级平台,适用于通常配备带内存保护单元(MPU)的 Cortex - M/R 处理器、小于 2MB 随机存取存储器(RAM)以及小于 16MB 闪存的设备。
TizenRT was kicked off with TinyAra project, which was based on the NuttX kernel, in 2015. NuttX is a real-time operating system (RTOS) with an emphasis on standard compliance and a small footprint. While maintaining the kernel architecture, TizenRT has grown by building up the IPv4/IPv6 network stack, file system, lightweight database called AraStorage, device monitor, and IoT protocols, such as OCF and LWM2M. The combination of AraStorage and IoT protocols allows TizenRT to collect, store, and deliver IoT sensor data easily.
2015 年,TizenRT 项目随着 TinyAra 项目启动,而 TinyAra 项目基于 NuttX 内核。NuttX 是一款实时操作系统,注重标准兼容性且占用空间小。在保留内核架构的基础上,TizenRT 不断发展壮大,构建了 IPv4/IPv6 网络堆栈、文件系统、名为 AraStorage 的轻量级数据库、设备监视器,以及 OCF 和 LWM2M 等物联网协议。AraStorage 与物联网协议的结合,使 TizenRT 能够便捷地收集、存储和传输物联网传感器数据。
Typical RTOS-based development environment has several limitations. First, it can not load additional modules at runtime, and second, it’s used to being inferior to a Linux environment. To tackle these limitations, TizenRT adopts Linux-style development environments, including POSIX API, BSD Socket API, Shell, and Kconfig build configuration. This helps Linux developers build their business logics easily on top of TizenRT. In addition, TizenRT has adopted the lightweight JavaScript environment, consisting of JerryScript and IoT.js, since 2017.
典型的基于RTOS 的开发环境存在一些局限性。其一,无法在运行时加载额外模块;其二,通常逊色于 Linux 环境。为突破这些局限,TizenRT采用了类Linux 发环境,包括 POSIX API、BSD 套接字 API、Shell 以及 Kconfig 构建配置。这有助于 Linux 开发者在 TizenRT 之上轻松构建业务逻辑。此外,自 2017 年起,TizenRT 采用了由 JerryScript 和 IoT.js 组成的轻量级 JavaScript 环境。
TizenRT has been commercialized in smart home appliances and various IoT devices without display since 2017. Now, TizenRT is looking forward to some intelligent features such as voice services.
自 2017 年起,TizenRT 已在智能家电和各类无显示屏物联网设备中实现商业化应用。当下,TizenRT 正朝着具备语音服务等智能特性的方向发展。
https://github.com/Samsung/TizenRT
- 某国内公司
在其发布的代码里面引用了NuttX VFS的代码,来实现对多种第三方文件系统的支持。
https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E5%86%85%E6%A0%B8%E5%AD%90%E7%B3%BB%E7%BB%9F.md
- Fibit
https://events.nuttx.apache.org/wp-content/uploads/2020/08/NuttX_at_Fitbit.pdf
四、丰富的第三方库:加速产品开发的“武器库”
NuttX的强大不仅在于内核,更在于其开放的生态支持。开发者可直接集成以下第三方库,快速实现复杂功能:
工业通信协议和电机控制算法库
CANOpen:提供完整的CANOpen协议栈,支持工业设备(如PLC、伺服驱动器)的实时通信。
Modbus:集成Modbus TCP/RTU库,简化工业传感器和控制器接入。
FOC:集成电机FOC控制算法。
图形与用户界面
- LVGL(Light and Versatile Graphics Library):轻量级嵌入式GUI库,支持触摸屏和动画效果,适用于智能家居面板、医疗设备界面。
- NxWidgets:In order to better support NuttX based platforms, a special graphical userinterface has been created called NXWidgets. NXWidgets is written in C++ and integrates seamlessly with the NuttX NX graphics subsystem in order to provide graphic objects, or “widgets,” in the NX Graphics Subsystem。
Cairo:Cairo 是一个开源的 2D 图形库,为软件开发者提供了一种矢量图形基础的、设备无关的 API,可以在 Linux、Windows、macOS 等多种操作系统上运行,使得开发者能够在不同平台上使用相同的 API 来进行图形绘制,提高了开发效率和代码的可移植性。
这个是作者在基于NuttX提供的标准POSIX API的基础上进行的移植,可以运行于Microchip SAMA5D2(Cortex-A5 Core) MPU上,支持NEON加速和标准的framebuffer接口,同时使用libplanes来实现对多图层显示控制。另外NuttX本身支持touch input,方便支持触摸屏输入接口。
GUILite:是一款轻量级、跨平台的 GUI 库,旨在为嵌入式设备等提供高效、灵活的用户界面解决方案。
这个也是作者在基于NuttX提供的标准framebuffer驱动上进行的移植。
C++支持与高性能计算
- STL嵌入式移植:提供受限环境下的C++标准库支持。
- Eigen:线性代数库,用于电机控制、机器学习的矩阵运算加速。
嵌入式数据库
- SQLite:支持轻量级SQL数据库,适用于数据采集设备的本地存储管理。
当时作者个人在2018年的时候做了SQLite第一次移植到NuttX,不过是基于Studio7下进行的,而且只运行在Microchip SAMV71-XULT开发板上,没有进一步将移植做进一步的推广,后来将这个移植分享给同为NuttX爱好者的Alan Carvalho de Assis,并由Alan完成最后的移植和提交工作。在这里要谢谢Alan的工作。
机器学习算法
- YOLO:YOLO 是 “You Only Look Once” 的缩写,是一种实时物体检测算法,在计算机视觉领域具有重要地位。
- NNABLA:NNabla 是由索尼公司开发的一个深度学习框架,旨在用于研究、开发和生产环境。
支持多种解释型的编程语言
- LUA:是一种轻量级、高效的脚本语言。
- Python:一种高级、通用、解释型的编程语言。
- MicroPython:是Python 3语言的精简高效实现,专为微控制器和受限环境设计。
- QuickJS:一款轻量级、高性能的 JavaScript 引擎。
丰富的网络工具
- COAP:
- MQTT:
- IPERF:
- FTP:
多种Bootloader的支持
- MCUboot:
- Minimal bootloader:
- NuttX bootloader:
MCUboot使用案例
分别烧录添加MCUboot支持的nuttx.bin文件和升级支持的update.agent.bin文件,然后用python3创建一个http server,最后在agent端执行升级命令。
五、NuttX RTOS 与其他RTOS的对比
特性 | NuttX | FreeRTOS | Zephyr | RT-Thread |
---|---|---|---|---|
架构设计 | 类Linux风格,支持完整POSIX/ANSI API | 极简内核,无标准API强制要求 | 模块化设计,强调可配置性 | 分层架构,支持动态模块加载 |
POSIX兼容性 | 完全兼容(文件、线程、信号等) | 部分兼容(需第三方库) | 部分兼容(受限API) | 部分兼容(需组件扩展) |
资源占用 | 2KB RAM(最小配置)~数MB(全功能) | 0.5KB RAM(最小配置) | 4KB RAM(最小配置) | 3KB RAM(最小配置) |
支持的处理器架构 | ARM、RISC-V、x86、MIPS、Xtensa等 20+种 | ARM、RISC-V、MSP430等 10+种 | ARM、RISC-V、x86等 15+种 | ARM、RISC-V、MIPS等 10+种 |
文件系统 | 内置FAT、NFS、ROMFS、PROCFS等 原生支持 | 需第三方库(如FreeRTOS+FAT) | 支持FAT、LittleFS(需配置) | 支持FAT、YAFFS(需组件扩展) |
网络协议栈 | 完整TCP/IPv4/v6、BSD Socket、HTTP、MQTT | 需第三方库(如lwIP) | 内置lwIP、支持CoAP、MQTT | 内置lwIP、支持LwM2M、WebSocket |
开发体验 | 类Linux开发(Shell、VFS、动态加载模块) | 需深度定制,依赖裸机编程习惯 | 强依赖设备树(DTS)配置 | 提供类似Linux的API(如POSIX) |
生态与社区 | Apache基金会支持,企业级应用案例广泛 | 商业支持多,社区资源碎片化 | Linux基金会主导,标准化程度高 | 中国开发者主导,本土生态活跃 |
实时性 | 硬实时(优先级抢占、微秒级中断延迟) | 硬实时 | 硬实时 | 硬实时 |
NuttX开箱即用组件一览
组件类别 | 支持的功能与协议 |
---|---|
文件系统 | FAT12/16/32、NFS、ROMFS、PROCFS、BINFS、SPIFFS(闪存文件系统) |
网络协议栈 | TCP/IPv4/v6、UDP、ICMP、ARP、BSD Socket、HTTP(S)、MQTT、Telnet、FTP、TFTP、802.15.4 |
USB协议栈 | USB Host/Device、HID、CDC、MSC(大容量存储)、RNDIS(网络设备) |
图形与GUI | LVGL(嵌入式GUI库)、NuttX原生图形框架(支持触摸、多图层渲染) |
数据库 | SQLite(轻量级SQL数据库)、FlatBuffers(高效序列化库) |
脚本语言 | MicroPython(嵌入式Python解释器)、Lua(需扩展) |
工业通信协议 | CANOpen、Modbus、RS485、I2C、SPI、UART |
安全与加密 | AES、SHA-1/256、TLS/SSL(mbedTLS集成)、安全启动支持 |
多核与异构计算 | OpenAMP(多核通信框架)、对称多处理(SMP)支持 |
系统工具 | NuttShell(交互式Shell)、ps、top、mount等Linux风格工具 |
其他中间件 | 音视频编解码(JPEG、PCM)、电机控制(PID算法)、AI推理(TensorFlow Lite Micro) |
六、为什么选择NuttX?
场景 | NuttX的优势体现 |
---|---|
复杂嵌入式设备 | 文件系统+网络+GUI一站式支持,适合智能家居网关、工业HMI |
Linux迁移项目 | POSIX兼容性允许直接复用Linux应用代码,降低移植成本 |
多核异构系统 | OpenAMP框架简化ARM+FPGA或Cortex-A+Cortex-M协同开发 |
快速原型验证 | 内置组件(如SQLite、LVGL)加速功能开发,无需从零造轮子 |
企业级产品 | Apache 2.0协议允许闭源修改,适合商业化部署 |
七、总结
NuttX通过 类Linux的完整性 和 嵌入式实时性的结合,填补了传统RTOS与Linux之间的空白。对于需要复杂功能(如网络、GUI)但受限于资源的场景,NuttX是更高效的解决方案。其开箱即用的特性尤其适合追求开发速度的团队,开发者可专注于业务逻辑而非底层适配。
很多芯片公司的产品对NuttX的适配都做的非常的好,希望大家能够在上面解锁更多有意思的项目。
八、补充篇 - 基于NuttX的各种开源项目
github.com/lupyuen/pinephone-nuttx