NuttX 是一个实时操作系统(RTOS),其重点遵从特定的标准并且尽量小型化。可伸缩良好且可适应从8位到32位单片机环境。Nuttx主要遵循的标准是 Posix和ANSI标准。其他的一些来自于Unix或者其他常规的实时操作系统(比如VxWorks)的标准的API的导入原因,要么是因为该功能不在如上标准中,要么是因为该功能不适合嵌入式环境(比如fork())。
NuttX首次由格雷戈里•纳特于2007年在宽松的BSD许可下发布。
关键特性
- 标准兼容。
- 核心任务管理。
- 模块化设计。
- 完全抢占的。
- 可扩展性好。
- 高度可配置的。
- 容易移植到新的处理器架构,SoC架构,或板级的架构。
- 先进先出、循环和“分散”调度机制。
- 实时的、确定性的、并且支持优先级继承。
- 动态始终操作。
- 类似于POSIX / ANSI的任务控制,有名消息队列,计数信号量,时钟/定时器、信号,线程,健壮的互斥锁,(线程)取消点,环境变量、文件系统。
- 与VxWorks相类似的任务管理和看门狗定时器。
- BSD套接字接口。
- 对管理抢占式特性的扩展。
- 具有地址环境的可选任务(的处理 )。
- 对称多处理(SMP)
- 可加载内核模块;轻量的嵌入式的共享库。
- 内存配置:(1)平面地址空间嵌入构建(所有函数都在一个地址空间内,没有虚拟地址导致的地址重叠情况),(2)由微处理器情况的保护构建,(3)有MMU情况下的内核构建。
- 内存分配器:(1)标准堆内存分配,(2)粗粒度分配器,(3)共享内存,(4)基于每个进程动态大小的堆。
- 线程本地存储(TLS)
- 可继承的“控制终端”和I / O重定向。伪终端。
- 按需分页。
- 系统日志记录。
- 可以构建作为一个开放单一镜像平面式的嵌入式实时操作系统(内存地址空间唯一)或分开构建,构建一个具有系统调用控制接口的安全内核(类似Linux方式)
- 内置线程级CPU负载测量。
- 客制化的NuttX C库
- NuttX用户指南很好的描述了应用程序接口 。
支持的平台
- ARM
- ARM7TDMI (TI TMS320 C5471, Calypso, MoxART, NXP LPC214x, LPC2378, STMicro STR71x)
- ARM920T (Freescale i.MX1)
- ARM926EJS (TI DM320, NXP LPC31xx)
- ARM Cortex-A5 (Atmel SAMA5D2, SAMA5D3, SAMA5D4)
- ARM Cortex-A8 (Allwinner A10)
- ARM Cortex-A9 (NXP/Freescale i.MX6)
- ARM Cortex-R4/R4F (TI TMS570)
- ARM Cortex-M0 (nuvoTon NUC120, NXP/Freescale KL25Z, KL26Z, Atmel SAMD20/21, SAML21, ST Micro STM32 F0)
- ARM Cortex-M3 (ST Micro STM32 F1/L4/F2, TI/Stellaris LM3S, NXP LPC17xx, Atmel SAM3U/3X, SiliconLabs EFM32)
- ARM Cortex-M4 (with/without floating point unit: ST Micro STM32 F3/F4/L4, TI/Stellaris LM4F/TM4C, NXP LPC43xx, Freescale Kinetis K20/K40/60/64/66, Atmel SAM4C/4E/4S/4L, Infineon XMC4xxx)
- ARM Cortex-M7 (Atmel SAMV71/SAME70, ST Micro STM32 F7)
- Atmel AVR
- Atmel 8-bit AVR (AT90USB, ATmega)
- AVR32
- Freescale M68HCS12
- Intel
- 80×86
- MIPS
- MicroChip PIC32MX (MIPS32 24Kc)
- MicroChip PIC32MZ (MIPS32 M14k)
- Misoc
- LM32 (Qemu)
- Renesas/Hitachi
- Renesas/Hitachi SuperH
- Renesas M16C/26
- RISC-V
- Xtensa LX6
- Expressif ESP32
- Zilog
- Zilog Z16F ZNeo
- Zilog eZ80 Acclaim!
- Zilog Z8Encore!
- Zilog Z80
文件系统
- 简洁的基于内存的,伪根文件系统 。
- 虚拟文件系统(VFS)
- 可挂载的卷。 绑定挂载点、文件系统和块设备驱动程序。
- 通用的系统日志(SYSLOG)支持。
- FAT12/16/32文件系统的支持。
- NFS客户端。 客户端支持网络文件系统(NFS版本3,基于UDP)。
- NXFFS。简洁的具有磨损平衡特性的NuttX闪存文件系统。
- SMART。来自于肯•佩蒂特的闪存文件系统。
- ROMFS文件系统的支持。
- BINFS伪文件系统支持。
- HOSTFS文件系统支持(模拟)。
- 联合文件系统。 支持合并和覆盖文件系统
- procfs 伪文件系统。
- 基于SPI总线的 MMC / SD / SDH卡的通用驱动程序。
- 支持以下格式的一个二进制加载程序 :
- 分开链接的ELF模块。
- 分开链接的NXFLAT 模块。NXFLAT一个是可以在文件系统中芯片内执行的二进制格式。
- PATH环境变量的支持。
- 通过TFTP和FTP进行文件传输(get和put方法),HTML(wget),Zmodem(sz,rz)。
- 英特尔十六进制转换。
设备驱动程序
- VFS支持字符和块设备驱动程序。
- 异步输入/输出(AIO)。
- 网络,USB(主机),USB(设备)、串口、I2C、i2,NAND,CAN,ADC、DAC、PWM、正交编码器(Quadrature Encoder),通用定时器和看门狗定时器驱动架构。
- RAMDISK,管道(PIPE)、FIFO、/ dev / null,/dev/zero /dev/random和回环设备驱动。
- 基于SPI总线的 MMC / SD / SDH卡的通用驱动程序。
- 电源管理子系统。
- ModBus协议通过内建的1.5.0版本的 FreeModBus 来支持。
- 图形设备:帧缓存驱动,图形和段式LCD驱动程序
- 音频子系统:编解码器、音频输入和输出驱动程序。 命令行和图形化的媒体播放器应用程序。
- Crytopgraphic子系统。
- 输入设备:触摸屏、USB键盘、USB鼠标,模拟/数字的摇杆、基于GPIO接口的按钮和键盘。
- 内存技术设备
- 模拟设备:支持模拟数字转换(ADC),数模转换(DAC)、多路复用器和放大器。
- 系统日志记录设备。
C / C++库
- 标准C库已经完全集成进了操作系统。
- 通过一个标准的数学库来支持浮点运算。
- 附加的 uClibc + + 模块组件提供标准c++库,该库支持输入输出流,字符串,STL,RTTI,异常等等。(LGPL)。
- Libc++中的构架编译器(LLVM)相关的最新接口也可以使用(c++11标准)。
网络
- 支持多网络接口; 支持多网络链路层。
- IPv4,IPv6、TCP / IP、UDP、ARP、ICMP、ICMPv6,IGMPv2(客户端)堆栈。
- 用户空间栈
- 流、数据报和原始数据包的套接字
- 支持原始套接字和本地,Unix域套接字
- DNS域名解析/ NetDB
- IEEE 802.11 完全的物理访问控制子层
- IEEE 802.15.4 MAC + 6 lowpan协议栈服务
- 串行线路接口协议(SLIP),TUN / PPP,本地回环设备
- 一个cJSON端口
- 占用空间小。
- BSD层套接字兼容。
- 网络实用程序(DHCP服务器和客户端,SMTP客户端,TELNET客户机,FTP服务器和客户端,TFTP客户机,HTTP服务器和客户端,PPPD,NTP客户端)。 可继承的TELNET会话(类似于“控制终端”)。 VNC服务器。
- ICMPv6自主自动配置。
- NFS客户端。 客户端支持网络文件系统(NFS 第三版,UDP)。
- Jeff Poskanzer 的THTTPD HTTP服务器基于nuttx被移植并且与NXFLAT一起被集成用以提供嵌入式公共网关接口(CGI)。
- 物理层链接状态管理。
- UDP广播网络发现。
- XML RPC服务器。
- 支持网络模块(如TI CC3000 WLAN模块)。
闪存支持
- 先进的接口用于内存技术接口设备。
- NAND闪存的支持。
- FTL:在闪存文件系统上支持简单的闪存转换层。
- NXFFS。 NuttX具有磨损平衡特性的闪存文件系统。
- 支持基于SPI的闪存设备。
USB支持
- USB主机支持
- USB主机架构包含USB主机控制器驱动程序和设备相关的USB类驱动程序。
- USB主机控制器驱动程序在Atmel SAMA5Dx,NXP LPC17xx,LPC31xx,意法半导体STM32等控制器上可用。
- USB大容量存储类,CDC / ACM,HID接口的键盘/鼠标,Xbox游戏控制器等设备相关usb类驱动可用。
- 无缝支持USB集线器。
- USB设备支持
- 类似于GADGET 式架构的USB设备控制器驱动程序和依赖设备的USB类驱动程序。
- USB设备控制器驱动程序在PIC32,Atmel AVR,SAM3,SAM4,SAMA5Dx,NXP LPC17xx,LPC214x,LPC313x,LPC43xx,芯科科技EFM32,意法半导STM32 F1,F2,F3,F4,德州仪器 DM320等芯片上可用。
- USB大容量存储类,CDC / ACM串口,PL2303仿真等设备相关的USB类驱动程序可用。
- 内置用于USB调试的 USB跟踪 功能。
图形支持
- 帧缓冲驱动。
- 基于并行和SPI接口的LCD,OLED等设备的图形液晶驱动程序支持。
- 段式LCD驱动程序
虚拟网络控制台(VNC)服务器
NX图形子系统 :一个可以工作在帧缓存或者LCD驱动的图形库,库中包含窗口系统和字体支持.
- NuttX小部件 :集成在NX图形系统中的一个用保守C++(使用基本的c++特性)写的图形用户接口。
- NuttX窗口管理器 :一个基于 NX图形子系统 和 NuttX小部件 的简洁的窗口管理器。
附加组件
NuttShell
用于NuttX的一个小的灵活的、类似于bash shell的包含丰富的功能集并且空间占用小的shell程序。Pascal语言运行环境
Pascal组件已经可用,可以在bitbucket.org网站上下载。应用程序包
应用程序包严格意义上来说并不是NuttX的一的部分但是仍与NuttX保存在同一个GIT仓库中但是与NuttX作为一个分开的版本包发布。应用程序包包含NuttX应用程序的集合(包括NuttShell),网络工具,测试工具和例子,程序原型,和NSH的扩展命令等等。
看这些文件和特性,怎么能相信这是一个简洁的操作系统?如上的NuttX特性列表是如此的长,并且如果你去查看NuttX源代码,你会发现有成百上千的源文件组成了NuttX操作系统。在具备如上复杂性和众多功能性的前提下,NuttX是如何做到简洁的?
- 大量的特性—-可以做到越多越小
NuttX背后的哲学是大多数特性是伟大的…但是如果你不需要这些特性,那么你就不必为这些不必要的特性付出代价(闪存空间消耗的代价)。是的,在NuttX里面,你不需要!如果你不需要使用某一个特性,他可以不出现在最终的可执行文件中。你仅仅需要对你所需要的特性付出空间占用增长的代价。
各种技术的使用,使得NuttX可以灵活的从一个很简洁的系统变化到一个中等规模的系统。我在一个仅仅有32K内存(代码和数据)的系统中执行了含有简单应用程序的NuttX操作系统。从另外一个方面来说,典型的,具有丰富特性的NuttX构建大约需要64K(如果所有的特性都打开,那么可能会达到100K)。 - 很多很多文件—-实际上却是更小
你可能会被NuttX的源码树大小所吓到。竟然有成百上千的源文件!这如何构建成一个简洁的操作系统?实际上,大量的源文件是NuttX保持简洁并且灵活的一个技巧。很多文件仅仅包含单一的功能。有时只是一个只有几行代码的极小的函数为什么?
- 静态库。因为在NuttX的构建处理过程中,对象被编译并且以静态库(存档)的形式被保存。然后,当可执行文件被链接的时候,仅仅被需要的文件对象会从存档中被解压并且合入到最终的可执行文件中。通过众多的简洁的源文件。你可以设想下,没有你不需要的代码会被包含到链接中。通过拥有许多小的源文件你将会拥有更细的粒度——如果您不使用这个函数,即使这个函数仅仅有几行代码,它都不会包含在二进制代码中。
- 其他的技巧
如上所述,许多简洁的源文件的使用和从静态库链接的方式保证了NuttX尽可能的小。在NuttX中使用的其他小技巧包括:
- 配置文件。在你构建NuttX之前,您必须提供一个配置文件以指定您打算使用哪些功能以及哪些功能你不要。该配置文件包含一长串的设置用以控制那些需要和不需要编译进NuttX的特性。有成百上千个这样的设置(请参阅配置变量文档以确定那些不包括平台特定设置的部分配置项)。这些诸多配置选项使得NuttX具有高度灵活性以满足空间要求。众多配置选项所带来的缺点是使得NuttX的维护变得更加复杂化——但那是我的麻烦,不是你的。
- 弱符号链接。GNU交叉编译工具链支持的弱符号特性也有助于
保持NuttX的小身材。弱符号机制阻止某些对象文件被链接即使他们从源代码中可以访问。小心地使用弱符号是另一个可以将未使用的代码排除最终版本中的一个技巧。