关于NuttX操作系统
关于NuttX操作系统
NuttX是一个成熟的实时操作系统,于07年由Gregory Nutt先生正式开源,2016年被三星选为TizenRT操作系统的内核,2019年在小米的推动下正式进入Apache基金会,经过开源社区多年的不懈努力,NuttX功能丰富,性能稳定,商业化成熟度高,Fitbit最近两代的手环产品和索尼多款消费级产品都是基于NuttX开发的。
为什么选择NuttX?
市场上开源或商业的RTOS非常多,为什么我们最终选择NuttX作为Xiaomi Vela的基础?主要有以下几个原因:
  • NuttX对POSIX标准有原生兼容:NuttX是可商用化RTOS中唯一一个对POSIX API有原生支持的实时操作系统,所以很多Linux社区的开源软件可以很方便的移植到NuttX上,这样可以极大的简化开源软件移植,方便代码复用,降低学习曲线,其它RTOS需要适配层把POSIX API转成内部API,而且通常只兼容一小部分的POSIX接口。
  • 完成度高:NuttX集成了文件系统、网络协议栈、图形库和驱动框架,减少开发成本。
  • 模块化设计:所有组件甚至组件内部特性,都可以通过配置Kconfig来调整或关闭,可按需对系统进行裁剪,适用于不同产品形态。
  • 代码精简:所有组件都是从头编码,专门对代码和数据做了优化设计。
  • 轻量级:虽然NuttX实现了传统操作系统的所有功能,但是最终生成的代码尺寸还是可以很小(最小配置不到32KB,最大配置不超过256KB)。
  • 和Linux系统的兼容性:因为NuttX整体设计、代码组织,编译过程和Linux非常接近,将会极大地降低Android/Linux开发者的迁移成本。
  • 活跃开放的社区:很多厂商(比如小米、Sony,乐鑫、NXP等)和开源爱好者都在积极回馈社区。
NuttX的系统架构
从纵向看,NuttX和传统操作系统一样由调度子系统、文件子系统、网络子系统、图形子系统和驱动子系统组成。从横向看,NuttX向上给应用程序提供了POSIX和ANSI定义的标准C/C++接口。对于没有标准化的组件(比如各种外设),NuttX通常会提供兼容Linux的API。向下NuttX定义了Arch API、块设备驱动接口、网卡驱动接口、display驱动接口,以及各种总线和外设的lower half驱动接口,使得芯片厂商能够规范、快速地完成移植工作。下图中数量众多的蓝色模块就是NuttX实现的各种功能。
子系统介绍
调度子系统
NuttX支持大多数RTOS都没有实现的进程概念,并提供完整的POSIX API,比如pthread、信号量、消息队列、时钟/定时器、信号、环境变量等。同时,也支持RTOS上常见的优先级翻转和tickless模式。NuttX支持对称多处理(SMP)和非对称多处理(AMP)两种多核编程模式,开发者可以根据芯片设计的特点和应用场景的需求,选择使用SMP或AMP,甚至同时使用SMP和AMP。NuttX支持所有常见CPU架构,比如Cortex-A/Cortex-R/Cortex-M、AVR、MIPS、32位/64位 RISC-V,X86/X64,Z80,以及Tensilica和CEVA的DSP,并有超过150款芯片成功移植到NuttX上。
文件系统
NuttX设计了一套完整而小巧的虚拟文件系统,除了支持统一的目录和文件操作外,还支持挂载点、字符设备,块设备等高级概念。直接支持10多种常用的文件系统。比如FAT、LittleFS、SmartFS、NFS、ROMFS、TMPFS等。另外,NuttX内置根文件系统,无需挂载即可启动,极大的简化了开发和部署流程。
网络子系统
NuttX实现了完整的网络协议栈,支持以太网、WiFi、802.15.4、蓝牙、CAN等数据链路层协议,支持IPv4、IPv6以及相关的ARP、ICMP、IGMP、MLD等传输层协议,实现了BSD兼容套接字API,除了常见的TCP、UDP协议外,还支持raw packet、unix domain、netlink套接字类型。另外,NuttX还提供了大量的应用层协议实现,比如DHCP、DNS、NTP、Telnet、FTP、SMTP、HTTP等。
驱动子系统
除了接入到文件系统的块设备驱动和接入到TCP/IP协议栈的网络设备驱动外,NuttX还为各种常见总线和外设定义了类似Linux的字符设备驱动。一方面通过NuttX为每类设备定义的标准IOCTL接口,应用程序可以用统一的API访问不同厂商的硬件驱动,另一方面NuttX驱动框架实现了和硬件无关的操作(比如权限控制、buffer管理,睡眠/唤醒等),降低驱动程序的开发难度。最后,NuttX提供了一套基于activity统计的低功耗管理框架,使得驱动程序可以方便地实现低功耗控制。
欢迎通过以下链接访问NuttX官网,也欢迎大家加入Apache NuttX社区。
https://nuttx.apache.org/