NuttX

NuttX is a real-time operating system (RTOS) with an emphasis on technical standards compliance and small size. Scalable from 8-bit to 32-bit microcontroller environments, the main governing standards in NuttX are from the Portable Operating System Interface (POSIX) and the American National Standards Institute (ANSI). Further standard application programming interfaces (APIs) from Unix and other common RTOSes (such as VxWorks) are adopted for functions unavailable under these standards, or inappropriate for deeply embedded environments, such as a fork.

NuttX was first released in 2007 by Gregory Nutt as free and open-source software under the permissive BSD license. It is currently undergoing incubation at The Apache Software Foundation.

Implementation 
NuttX is written almost exclusively in the programming language C and uses Kconfig to configure and generate GNU makefiles for the system. The program distribution combines the kernel and a substantial amount of middleware and code for board support and device drivers. The kernel and much of the other code was written by the original author, Gregory Nutt. He maintains the source code exclusively, and must approve all community contributions.

Key features 
 Standards compliant
 Core task management
 Modular design
 Fully preemptible
 Naturally scalable
 Highly configurable
 Easily extensible to new processor architectures, SoC architecture, or board architectures
 Scheduling: first in, first out (FIFO) and round-robin (RR)
 Real-time, deterministic, with support for priority inheritance
 Tickless operation
 POSIX/ANSI-like task controls, named message queues, counting semaphores, clocks/timers, signals, POSIX Threads (pthreads), environment variables
 Multiple file systems
 VxWorks-like task management and watchdog timers
 BSD socket interface
 Extensions to manage preemption
 Optional tasks with address environments (processes)
 Symmetric multiprocessing (SMP)
 Loadable kernel modules
 Memory configurations: (1) flat embedded build, (2) protected build with MPU, and (3) kernel build with MMU
 Memory allocators: (1) standard heap memory allocation, (2) granule allocator, (3) shared memory, and (4) dynamically sized, per-process heaps
 Thread local storage (TLS)
 Inheritable controlling terminals, pseudoterminals (PTY) and input/output (I/O) redirection
 On-demand paging
 System logging
 May be built either as an open, flat embedded RTOS or as a separately built, secure kernel with a system call gate interface
 Built-in, per-thread CPU load measurements
 Custom NuttX C library

Supported platforms 
 ARM
 ARM7TDMI (TI TMS320 C6571, 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, Samsung Artik)
 ARM Cortex-M0 (nuvoTon: NUC120, NXP: KL25Z, KL26Z, LPC11xx, Atmel: SAMD20/21, SAML21, ST Micro STM32 F0)
 ARM Cortex-M3 (ST Micro STM32 F1/F2/L1, TI/Stellaris LM3S, NXP LPC17xx, Atmel SAM3U/3X, SiliconLabs EFM32)
 ARM Cortex-M4 (with/without floating point unit: ST Micro STM32 F3/F4/L4/L4+, TI/Stellaris LM4F/TM4C, NXP LPC43xx/LPC54xx, Freescale Kinetis K20/K28/K40/60/64/66, Atmel SAM4C/4E/4S/4L, Infineon XMC4xxx, Nordic NRF52xxx, Sony CXD5602/Spresense)
 ARM Cortex-M7 (Atmel SAMV71/SAME70, ST Micro STM32 F7/H7, NXP i.MX RT)
 Atmel AVR
 Atmel 8-bit AVR (AT90USB, ATmega)
 AVR32
 Freescale M68HCS12
 Intel
 80x86
 MIPS
 MicroChip PIC32MX (MIPS32 24Kc)
 MicroChip PIC32MZ (MIPS32 M14k)
 Misoc
 LM32 (Qemu)
 OpenRISC
 mor1kx
 Renesas/Hitachi
 Renesas/Hitachi SuperH
 Renesas M16C/26
 RISC-V
 NEXT RISC-V NR5Mxx (RV32IM)
 GreenWaves GAP8 (RV32IM)
 Xtensa LX6
 Expressif ESP32
 Zilog
 Zilog Z16F
 Zilog eZ80 Acclaim!
 Zilog Z8Encore!
 Zilog Z80

File system 
 Tiny in-memory, root pseudo-file-system
 Virtual file system (VFS)
 Mountable volumes. Bind mountpoint, file system, and block device driver
 Generic system logging (SYSLOG) support
 File Allocation Table (FAT) 12/16/32 file system support
 Network File System (NFS) client, supports NFS, version 3, UDP
 NXFFS: a tiny wear-leveling flash memory file system
 SMART: flash file system from Ken Pettit
 Generic driver for SPI-based cards: MultiMediaCard (MMC) and Secure Digital (SD/SDHC)
 Romfs file system support
 BINFS pseudo-file system support
 HOSTFS file system support (simulation only)
 Union file system: supports combining and overlaying file systems
 PROCFS (/proc) pseudo-file system
 A Binary Loader with support for the following formats:
 Separately linked Executable and Linkable Format (ELF) modules
 Separately linked modules for NXFLAT: a binary format that can be XIP from a file system
 PATH variable support
 File transfers via TFTP and FTP (get and put), HTML (wget), and Zmodem (sz and rz)
 Intel HEX conversions

Device drivers 
 VFS supports character and block drivers
 Asynchronous I/O (AIO)
 Network, USB (host), USB (device), serial, I2C, I2S, NAND, Controller Area Network (CAN bus), ADC, DAC, PWM, Quadrature Encoder, and watchdog timer driver architectures
 RAM drive or disk, pipes, FIFO, /dev/null, /dev/zero drivers
 Generic driver for SPI-based or SDIO-based MMC/SD/SDH cards
 Power management subsystem
 Modbus support provided by built-in FreeModBus version 1.5.0
 Graphics devices: framebuffer drivers, graphic and segment LCD drivers
 Audio subsystem: Codecs, audio input and output drivers. Command line and graphic media player applications
 Cryptographic subsystem
 Input devices: touchscreen, USB keyboard, USB mouse, GPIO-based buttons and keypads
 Memory technology devices
 Analog devices: support for analog-to-digital converter (ADC), digital-to-analog converter (DAC), multiplexers, and amplifiers
 System logging devices
 Porting guide

C/C++ library 
 Standard C library fully integrated into the OS
 Includes floating point support via a Standard Math Library
 Add-on uClibc++ module provides Standard C++ Library supporting input/output (C++) (iostreams), strings, Standard Template Library (STL), run-time type information (RTTI), exceptions, etc. (LGPL)

Networking 
The network stack included with NuttX is derived from uIP (micro IP), originally developed by Adam Dunkels.
 Multiple network interface support; multiple network link layer support
 IPv4, IPv6,Internet protocol suite (TCP/IP), User Datagram Protocol (UDP), Internet Control Message Protocol (ICMP), Internet Group Management Protocol (IGMP) version 2 (client) stacks
 Stream and datagram sockets
 Raw socket and local, Unix domain socket support
 DNS name resolution, NetDB
 IEEE 802.11 (WiFi) FullMac
 IEEE 802.15.4 MAC + 6loWPAN
 Serial Line Internet Protocol (SLIP), TUN/PPP, local loopback devices
 A cJSON port
 Small size (based on uIP)
 BSD compatible socket layer
 Networking utilities (Dynamic Host Configuration Protocol (DHCP) server and client, Simple Mail Transfer Protocol (SMTP) client, Telnet client, File Transfer Protocol (FTP) server and client, Trivial File Transfer Protocol (TFTP) client, Hypertext Transfer Protocol (HTTP) server and client, Network Time Protocol (NTP) client); inheritable Telnet sessions (as controlling terminal). VNC server
 Network File System (NFS) client, supports NFS, version 3, UDP
 ICMPv6 autonomous auto-configuration
 A NuttX port of Jef Poskanzer's thttpd HTTP server integrated with NXFLAT to provide embedded CGI
 PHY link status management
 UDP network discovery, XML RPC server
 XML RPC server
 Support for network modules (such as the TI CC3000 WLAN module)

Flash support 
 Memory Technology Device (MTD) inspired interface for MTD devices
 FTL: simple flash Translation Layer support file systems on Flash
 NAND Support
 NXFFS: a wear-leveling flash memory file system
 Support for Serial Peripheral Interface (SPI) bus based flash devices

USB support

Host 
 USB host architecture for USB host controller drivers and device-dependent USB class drivers.
 USB host controller drivers available for the Atmel SAMA5Dx, NXP LPC17xx, LPC31xx, and STmicro STM32.
 Device-dependent USB class drivers available for USB mass storage and HID keyboard.
 Seamless support for USB hubs.

Device 
 Gadget-like architecture for USB device controller drivers and device-dependent USB class drivers
 USB device controller drivers available for the PIC32, Atmel AVR, SAM3, SAM4, and SAMA5Dx, NXP LPC17xx, LPC214x, LPC313x, and LPC43xx, Silicon Laboraties EFM32, STMicro STM32 F1, F2, F3, and F4, and TI DM320.
 Device-dependent USB class drivers available for USB serial and for USB mass storage
 Built-in USB trace functionality for USB debug

Graphics support 
 Framebuffer drivers
 Liquid-crystal display (LCD) drivers for both parallel and SPI LCDs and organic light-emitting diode (OLED)
 Segment LCD drivers
 VNC Server
 NX Graphics Subsystem: A graphics library, windowing system, and font support that works with either framebuffer or LCD drivers
 NuttX Widgets: A graphical user interface (GUI) written in conservative C++ that integrates with NX graphics
 NuttX window manager: tiny, based on the NX graphics subsystem and NuttX widgets

Projects using it 
 Thingsee Internet of things (IoT) development device.
 PX4 autopilot uses NuttX to control a variety of autonomous platforms.
 Biffer Board supports many RTOSs including NuttX.
 MP3 player implemented with NuttX.
 OsmocomBB uses NuttX to develop an operating system for cell phones.
 A homebrew steer-by-wire system implemented using NuttX.
 Video Performance Measurement Device.
 Low Power Embedded Software Optimization for the NuttX RTOS.
 Motorola Moto Z.
 Sony uses NuttX in their audio processors.
 Samsung announces TizenRT based on NuttX RTOS.

References

External links 
 
 Official NuttX user group
 Linux Journal mentioned NuttX This citation bring NuttX attention to my Linux developers on 2010-09-01
 Compiling NuttX to micropendousX open hardware board
 Dangerous Prototypes post about NuttX Dangerous Prototypes is creator of famous Bus Pirate board sniffer.
 Port of NuttX to x86

Category:Real-time operating systems
Category:Embedded operating systems
Category:Free software operating systems
Category:ARM operating systems
Category:Software using the BSD license
Category:Microkernel-based operating systems
Category:Microkernels