# NuttX

NuttX ist ein Echtzeitbetriebssystem (RTOS) mit Schwerpunkt auf der Einhaltung von technischen Standards und geringer Größe, skalierbar für 8-bit- bis 64-bit-Mikrocontroller-Umgebungen. Die wichtigsten Standards in NuttX stammen aus dem Portable Operating System Interface (POSIX) und dem American National Standards Institute (ANSI). Weitere Standard-Anwendungsprogrammierschnittstellen (APIs) von Unix und anderen gängigen RTOS (z. B. VxWorks) werden für Funktionen übernommen, die unter diesen Standards nicht verfügbar sind oder für tief eingebettete Umgebungen ungeeignet sind, wie z. B. fork.
NuttX wurde erstmals 2007 von Gregory Nutt als freie und quelloffene Software unter der permissiven BSD-Lizenz veröffentlicht. Seit Dezember 2019 befindet es sich in der Inkubation bei der Apache Software Foundation.

## Implementierung

NuttX ist fast ausschließlich in der Programmiersprache C geschrieben und verwendet Kconfig zur Konfiguration und Generierung von GNU makefiles für das System. Die Programmdistribution kombiniert den Kernel und eine beträchtliche Menge an Middleware und Code für Board-Unterstützung und Gerätetreiber. Der Kernel und ein Großteil des anderen Codes wurde vom ursprünglichen Autor Gregory Nutt geschrieben.

## Hauptmerkmale

Die Hauptcharakteristika von NuttX sind:
* Standardkonformität
* Task-Verwaltung
** Kern-Task-Verwaltung
** Prozesse (optional)
** POSIX/ANSI-ähnliche Task-Steuerung
* Modularer Aufbau
* Präemptives Multitasking
* Skalierbarkeit
* Hochgradig konfigurierbar
* Leicht erweiterbar auf neue Prozessorarchitekturen, SoC-Architekturen oder Board-Architekturen
* Scheduler: FIFO, Round Robin
* Deterministisches Echtzeitverhalten, mit Unterstützung für Prioritätsvererbung
* Tickless-Betrieb
* Interprozesskommunikation (IPC): benannte Message Queues, Semaphore, Signale, Clocks/Zeitgeber, Umgebungsvariablen
* POSIX-Threads (pthreads)
* Mehrere Dateisysteme
* VxWorks-ähnliche Taskverwaltung und Watchdog-Timer
* BSD-Socket-Schnittstelle
* Erweiterungen zur Verwaltung von Präemption
* Symmetrisches Multiprozessorsystem (SMP)
* Zuladbare Kernel-Module
* Speicherkonfigurationen
** flach eingebetteter Build
** geschützter Build mit MPU
** Kernel-Build mit MMU
* Speicherallokatoren
** Standard-Heap-Speicherzuweisung
** Granulat-Allokator
** Shared Memory
** dynamisch dimensionierte Heaps pro Prozess
* Thread-lokaler Speicher (TLS)
* Vererbbare Steuerterminals, Pseudoterminals (PTY) und Input/Output (I/O)-Umleitung
* On-demand paging
* Systemprotokollierung
* Eingebaute CPU-Lastmessungen pro Thread
* Benutzerdefinierte NuttX-C-Standard-Bibliothek

## Unterstützte Plattformen

Die NuttX-Website listet alle unterstützten Plattformen nach Prozessorarchitektur sowie nach Hersteller/Mikrocontrollerfamilie auf. Zu den unterstützten Prozessorarchitekturen zählen:
* Arm
** ARM7TDMI
** ARM920T
** ARM926EJS
** Arm Cortex-A5/8/9
** Arm Cortex-R
** Arm Cortex-M0/3/4/7
* Microchip AVR (8-bit) und Atmel AVR32
* Freescale M68HCS12
* Intel 80x86
* Microchip Technology PIC32
* Misoc
* OpenRISC
* Renesas/Hitachi
* RISC-V
* Xtensa LX6
* Zilog

## Projekte, die NuttX verwenden

* Die Thingsee IoT-Gateway-Geräte von Haltian verwenden das Betriebssystem ThingseeOS, das auf NuttX basiert.
* Der PX4-Autopilot nutzt NuttX zur Steuerung einer Vielzahl autonomer Plattformen.
* Biffer Board unterstützt viele RTOSs, darunter NuttX.
* MP3-Player implementiert mit NuttX
* OsmocomBB nutzt NuttX, um ein Betriebssystem für Handys zu entwickeln
* Ein selbstentwickeltes Steer-by-Wire-System, das mit NuttX implementiert wurde
* Das Motorola Moto Mods Development-Kit basiert auf NuttX.
* Sony verwendet NuttX in seinen Audioprozessoren
* Samsungs Tizen RT basiert auf NuttX
* Xiaomi lancierte im November 2020 die IoT-Software-Plattform Xiaomi Vela, die auf NuttX basiert.