O sistema operacional de tempo real NuttX
- por Sergio Prado
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).
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