O sistema operacional de tempo real NuttX

- por Sergio Prado

Categorias: RTOS Tags:

O NuttX é um sistema operacional de tempo real (RTOS) de código aberto para microcontroladores com uma ênfase em compatibilidade com padrões de mercado (POSIX e ANSI) e baixo consumo de recursos (CPU, RAM e flash).

NuttX_logo

Criado por Gregory Nutt (daí o seu nome) em 2007 e liberado sob licença BSD, suporta diversas arquiteturas de microcontroladores, de 8 a 32 bits, incluindo ARM, AVR, 8051, MIPS e z80.

É um sistema operacional bem completo, e além do kernel de tempo real, possui suporte à sistemas de arquivos, pilha de protocolos TCP/IP, USB host e device, biblioteca gráfica e um conjunto de aplicações adicionais como um terminal de linha de comandos (NuttShell) e diversas outras ferramentas.

Ele pode ser considerado um meio termo entre sistemas operacionais mais completos como os baseados no kernel Linux, e sistemas operacionais mais simples, compostos apenas pelo escalonador e algumas funções de suporte, como o FreeRTOS.

CÓDIGO-FONTE

No momento em que escrevo este artigo, o código-fonte do NuttX pode ser obtido clonando seu repositório no Bitbucket ou baixando um tarball no Sourceforge (instruções completas para baixar o código-fonte estão disponíveis no site do projeto).

A estrutura do código-fonte do NuttX é bem parecida com a do kernel Linux:

$ ls nuttx/
arch       Directories.mk  Kconfig        Make.defs         README.txt
audio      Documentation   KernelLibs.mk  Makefile          ReleaseNotes
binfmt     drivers         lib            Makefile.unix     sched
ChangeLog  FlatLibs.mk     libc           Makefile.win      setenv.sh
configs    fs              libnx          mm                syscall
COPYING    graphics        LibTargets.mk  net               TODO
crypto     include         libxx          ProtectedLibs.mk  tools

Seu sistema de compilação é baseado na ferramenta make, o que o torna ideal para ser compilado em máquinas GNU/Linux (apesar de ser possível compilar o NuttX no Windows com o Cygwin).

O NuttX suporta diversas arquiteturas de hardware, e a lista completa de arquiteturas suportadas pode ser visualizada listando o diretório arch do código-fonte do projeto:

$ ls arch/
arm  avr  hc  Kconfig  mips  README.txt  rgmp  sh  sim  x86  z16  z80

No diretório configs podemos ver todas as placas suportadas, incluindo diversas plataformas comuns como Arduino, Freedom Board, Mbed, PIC32, Teensy e Launchpad:

$ ls configs/
amber             lm3s8962-ek               olimex-stm32-p207   stm3210e-eval
arduino-due       lm4f120-launchpad         olimex-strp711      stm3220g-eval
avr32dev1         lpc4330-xplorer           open1788            stm3240g-eval
boardctl.c        lpc4357-evb               p112                stm32f3discovery
c5471evm          lpcxpresso-lpc1115        pcblogic-pic32mx    stm32f429i-disco
cc3200-launchpad  lpcxpresso-lpc1768        pcduino-a10         stm32f4discovery
cloudctrl         Make.dep                  pic32mx7mmb         stm32f746g-disco
compal_e86        Makefile                  pic32mx-starterkit  stm32ldiscovery
compal_e88        maple                     pic32mz-starterkit  stm32_tiny
compal_e99        mbed                      pirelli_dpl10       stm32vldiscovery
demo9s12ne64      mcu123-lpc214x            qemu-i486           sure-pic32mx
dk-tm4c129x       micropendous3             README.txt          teensy-2.0
ea3131            mikroe-stm32f4            rgmp                teensy-3.x
ea3152            mirtoo                    sam3u-ek            teensy-lc
eagle100          moteino-mega              sam4e-ek            tm4c123g-launchpad
efm32-g8xx-stk    mt-db-x3                  sam4l-xplained      tm4c1294-launchpad
efm32gg-stk3700   mx1ads                    sam4s-xplained      twr-k60n512
ekk-lm3s9b96      ne64badge                 sam4s-xplained-pro  ubw32
ez80f910200kitg   ntosd-dm320               sama5d3x-ek         us7032evb1
ez80f910200zco    nucleo-f4x1re             sama5d3-xplained    viewtool-stm32f107
fire-stm32v2      nucleus2g                 sama5d4-ek          vsn
freedom-kl25z     nutiny-nuc120             samd20-xplained     xtrs
freedom-kl26z     olimex-efm32g880f128-stk  samd21-xplained     z16f2800100zcog
hymini-stm32v     olimexino-stm32           saml21-xplained     z80sim
Kconfig           olimex-lpc1766stk         samv71-xult         z8encore000zco
kwikstik-k40      olimex-lpc2378            shenzhou            z8f64200100kit
lincoln60         olimex-lpc-h3131          sim                 zkit-arm-1769
lm3s6432-s2e      olimex-stm32-h405         skp16c26            zp214xpa
lm3s6965-ek       olimex-stm32-p107         spark

A lista completa de plataformas suportadas está disponível no site do projeto.

O KERNEL DE TEMPO REAL

O kernel do NuttX é 100% preemptível, suportando os algoritmos de escalonamento FIFO (SCHED_FIFO) e round-robin (SCHED_RR).

O escalonador do NuttX irá sempre executar a tarefa de maior prioridade pronta para execução (SCHED_FIFO). Caso duas ou mais tarefas de mesma prioridade estejam prontas para execução, ele irá definir um timeslice (fatia de CPU) para cada tarefa, e chavear a execução entre estas tarefas (SCHED_RR).

Ele suporta diversos mecanismos de sincronização, incluindo semáforos, message queues, timers e sinais, além de possuir integrada ao kernel uma biblioteca C padrão com suporte à ponto flutuante.

$ ls libc/
aio     fixedmath  libgen          math      netdb       sched      stdio   termios  wqueue
audio   kbin       lib_internal.h  math.csv  pthread     semaphore  stdlib  time
bin     Kconfig    Make_bin.dep    misc      queue       signal     string  ubin
dirent  libc.csv   Makefile        net       README.txt  spawn      syslog  unistd

Possui também o conceito de threads (ou grupo de tarefas) onde uma tarefa pode criar outra tarefa, compartilhando o mesmo ambiente de execução, incluindo variáveis de ambiente, descritores de arquivo e sockets abertos.

A API completa do NuttX está descrita no guia do usuário.

SISTEMA DE ARQUIVOS

O NuttX possui um sistema de arquivos virtual (VFS – Virtual Files System) que o torna bem parecido com ambientes Unix, suportando pontos de montagem e exportando uma API POSIX (open, read, write, close, etc), que possibilita abstrair o acesso aos objetos do kernel (estruturas de dados, device drivers, etc) através de arquivos.

Ele suporta diversos sistemas de arquivos, incluindo FAT12/16/32, ROMFS, NXFFS e SMART (ambos para memórias flash), além de possuir um cliente NFS para montar um sistema de arquivos pela rede.

O código-fonte dos sistemas de arquivos suportados pelo NuttX está disponível no diretório fs do código-fonte:

$ ls fs/
aio     driver           inode     Makefile  mqueue  procfs     shm      vfs
binfs   fat              Kconfig   mmap      nfs     romfs      smartfs
dirent  fs_initialize.c  Make.dep  mount     nxffs   semaphore  unionfs

REDE

O NuttX suporta os protocolos mais comuns da pilha de protocolos TCP/IP, incluindo IPv4, IPv6, TCP/IP, UDP, ICMP, IGMPv2, DNS, DHCP, SMTP, TELNET, FTP, TFTP, HTTP e NTP.

$ ls net/
arp    icmp    igmp  Kconfig  Makefile  netdev            pkt         route   tcp  utils
devif  icmpv6  iob   local    neighbor  net_initialize.c  README.txt  socket  udp

É possível estabelecer uma conexão de rede utilizando diversos tipos de sockets, incluindo stream sockets, datagram sockets, raw sockets e UNIX domain sockets.

USB HOST/DEVICE

O NuttX possui uma implementação de controladora USB host para algumas plataformas de hardware, incluindo Atmel SAMA5Dx, NXP LPC17xx, LPC31xx, and STmicro STM32, onde suporta dispositivos da classe USB mass storage e HID keyboard.

Já a implementação de USB device está disponível para diversas plataformas de hardware, suportando as classes USB mass storage, CDC/ACM serial, HID keyboard e HID mouse.

APLICAÇÕES

O NuttX possui um conjunto de aplicações que são mantidas em um repositório separado do repositório principal do projeto.

Este repositório de aplicações inclui um interpretador de linha de comandos (NuttShell) e diversas outras ferramentas, incluindo utilitários de acesso ao hardware (ADC, CAN, PWM, etc), servidores de rede (telnet, ftp, webserver, etc) e ferramentas de linha de comando (mount, pipe, wget, etc).

$ ls apps/examples/
adc         djoystick   keypadtest  nrf24l01_term  pashello     sendmail       touchscreen
ajoystick   elf         lcdrw       nsh            pipe         serialblaster  udgram
bastest     flash_test  ltdc        null           poll         serialrx       udp
bridge      ftpc        Make.defs   nx             posix_spawn  serloop        unionfs
buttons     ftpd        Makefile    nxffs          pppd         slcd           usbserial
can         hello       mm          nxflat         pwm          smart          usbterm
cc3000      helloxx     modbus      nxhello        qencoder     smart_test     ustream
configdata  hidkbd      mount       nximage        random       tcpecho        watchdog
cpuhog      i2schar     mtdpart     nxlines        README.txt   telnetd        webserver
cxxtest     igmp        mtdrwb      nxterm         relays       thttpd         wget
dhcpd       json        netpkt      nxtext         rgmp         tiff           wgetjson
discover    Kconfig     nettest     ostest         romfs        timer          xmlrpc

DOCUMENTAÇÃO E COMUNIDADE

O NuttX é muito bem documentado através da página principal do projeto, e o guia de usuário é bem completo, descrevendo toda a API do sistema operacional.

A documentação também está disponível no diretório Documentation do código-fonte:

$ ls Documentation/
acronyms.txt    NuttX2.png                 NuttXNxFlat.html          NxWidgets.html
backgd.gif      NuttX320.png               NuttX.png                 pm.png
favicon.ico     NuttXBinfmt.html           NuttxPortingGuide.html    README.html
NfsHowto.html   NuttXCCodingStandard.html  NuttXScreenShot.jpg       redirect.html
NuttShell.html  NuttXDemandPaging.html     NuttxUserGuide.html       UsbTrace.html
NuttX2-a.png    NuttXGettingStarted.html   NXGraphicsSubsystem.html
NuttX2-b.png    NuttX.html                 NXOrganization.gif

Como todo projeto de código aberto, a lista de discussão é o ponto central para se comunicar com os desenvolvedores do projeto, reportar bugs, sugerir melhorias e colaborar. O grupo de discussão do NuttX está hospedado no Yahoo Groups.

CONCLUSÃO

Fiquei impressionado com a qualidade do projeto, muito bem mantido e documentado.

O NuttX é muito mais que um escalonador de tarefas (como o FreeRTOS). É um sistema operacional completo, com pilhas de protocolo, sistemas de arquivo, device drivers e suporte às principais arquiteturas de microcontroladores do mercado.

Esta integração pode aumentar bastante a produtividade do desenvolvedor, em troca de um consumo um pouco maior de recursos (CPU, RAM e flash). Na prática, pode ser uma ótima solução quando precisa-se de um sistema operacional mais completo em projetos com microcontroladores.

Utilizando o terminal de linha de comandos NuttShell, você se sente dentro de um terminal Linux!

É isso que quero mostrar à vocês no próximo artigo, onde iremos aprender a compilar e executar o NuttX na Freedom Board KL25Z da Freescale.

Até lá!

Um abraço,

Sergio Prado

  • diego w antunes

    Ansioso pelo próximo post. :)

  • João Marcos S. Scaramal

    A proposta é muito boa Sérgio…
    E realmente é um trade off interessante rtos x recursos… Aguardando próximo post pra ver na prática…

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.