Existem inúmeros Sistemas Operacionais de Tempo Real (RTOS na abreviação em inglês) disponíveis na Internet (veja uma “pequena listagem” aqui). Muitos destes RTOS’s, contudo, são projetos que já deixaram de existir ou não estão mais sendo mantidos.

Dos demais RTOS’s, que continuam sendo desenvolvidos, a maioria só suporta um único microcontrolador ou uma única família de microcontroladores. Filtrando ainda mais, nota-se que mesmo os poucos sistemas operacionais de tempo real que suportam múltiplos microcontroladores não possuem todos os recursos que as empresas e desenvolvedores precisam, como: USB, Ethernet, Wi-Fi, 6LoWPAN, LCD gráfico, SD Card, Sistema de Arquivo FAT, barramento CAN, RS485, etc.

Já o sistema operacional de tempo real NuttX suporta todos esses recursos citados acima (e muito mais), além de suportar várias arquiteturas de microcontroladores e microprocessadores: AVR; ARM (ARM7, ARM9, ARM11, Cortex A8/A9, Cortex M0/M3/M4/R4); HC11/12; LM32; MIPS; M16C; RISC-V; SH1; X86; Xtensa LX6; Z16; Z80.

Se seu projeto precisar usar um cartão SD Card com um sistema de arquivos FAT, você não precisará portar e depurar (“debugar”) o FATFS para usar com seu projeto. O mesmo vale para outros recursos como ModBus, Micropython, etc. Tudo já está devidamente integrado no sistema e você não pagará nada por isso. Isso mesmo, o NuttX é um RTOS complemente livre sob licença BSD, open-source e gratuito.

Não tem pegadinhas, não tem restrições de uso, não tem licença GPL com exceções. A licença GPL funciona muito bem para aplicações desktop, mas para aplicações em dispositivos embarcados ela pode ser problemática, uma vez que torna-se difícil manter partes do código fonte proprietário misturado com código fonte aberto.

Talvez por este motivo o próprio Google está criando seu sistema operacional Fuchsia utilizando a licença BSD. Assim as fabricantes de dispositivos que usarem esse sistema não correm o risco de serem processados na justiça por não cumprirem as obrigações definidas na licença GPL (usada no kernel do Linux).

Características do NuttX

O NuttX é um sistema operacional de tempo real que segue o padrão POSIX. Isto significa que você não precisa aprender uma nova API para criar seus programas. Você pode escrever sua aplicação num sistema operacional POSIX como o Linux ou o MacOS, validar seu funcionamento e então basta recompilar para utiliza-la no NuttX. Você também não precisará criar sua aplicação partindo do zero, pois poderá utilizar algumas das pequenas bibliotecas disponíveis pra Linux e apenas fazer poucas modificações para compilá-las no NuttX.

O NuttX possui muitos subsistemas que se assemelham aos subsistemas existentes no Linux. Por exemplo: Virtual File System (VFS), Memory Technology Device (MTD), subsistema de Áudio, subsistema USB com suporte à USB composto (USB Composite: uma única porta USB funcionando como múltiplos dispositivos ao mesmo tempo) e muitos outros subsistemas. A principal diferença do NuttX em relação ao Linux é o tamanho do sistema, o NuttX é muito pequeno. Um sistema NuttX básico vai rodar com menos de 32KB de Flash e menos de 8KB de RAM. Claro, se você quiser incluir mais recursos como USB, Ethernet, WiFi, IPv6, CAN, etc, é melhor você usar um microcontrolador com mais de 64KB de Flash e ao menos 32KB de RAM.

Todos estes fatos explicam porque muitas fabricantes já estão utilizando o NuttX (inclusive aqui no Brasil). Você já ouviu falar do smartphone modular Motorola Moto Z? Nele, o usuário pode colocar capas inteligentes (chamadas de Snaps ou Mods) transformando seu smartphone em um projetor multimídia, ou uma câmera com Zoom ótico, ou um sistema de som, ou qualquer outra função que ele queira. Talvez você não saiba, mas estas capas inteligentes estão rodando NuttX internamente. Além da Motorola, a Sony está usando o NuttX nos seus gravadores de áudio digital, headphones bluetooth (a Sony apresentou seus dispositivos com NuttX na Embedded Linux Conference de 2017). Outra grande empresa que está usando o NuttX é a Samsung; sim o NuttX (ou melhor, um fork dele) é utilizado no TizenRT. Infelizmente a Samsung mudou a licença do código fonte NuttX de BSD para Apache e nunca contribuiu de volta com as melhorias que eles fizeram (como a adição de Journaling no sistema de arquivos SmartFS do NuttX).

Outras empresas não tão conhecidas também estão utilizando o NuttX: a 3DRobotics utiliza o NuttX nos seus drones (ou veículos aéreos não tripulados para evitar confusão com drones militares) que são desenvolvidos com o sistema PX4; a Haltian utiliza o NuttX nos seus dispositivos IoT como o ThingSee One. Aqui no Brasil o NuttX já é utilizado por uma conhecida fabricante de impressoras fiscais.

Apesar de pouco conhecido da grande mídia, o NuttX não é um RTOS novo. A primeira versão foi liberada há mais de 10 anos (em Fevereiro de 2007). O criador do NuttX é o senhor Gregory Nutt (daí a origem do nome NuttX). O Greg trabalhou durante muitos anos com sistemas embarcados na indústria aeroespacial e também na HP, onde desenvolveu o sistema de tempo real usado nas impressoras. Também trabalhou desenvolvendo sistemas embarcados com Linux em várias empresas (ex.: AMD, ATI, Motorola, etc) e foi o co-fundador de uma empresa de desenvolvimento de sistemas embarcados com Linux no início dos anos 2000. Quando ele percebeu que não havia nenhum RTOS POSIX open-source, resolveu colocar toda sua experiência no desenvolvimento do NuttX.

Gregory Nutt: criador do NuttX
Figura 1 – Gregory Nutt: criador do NuttX

Mas então por que você nunca ouviu falar no NuttX até hoje? É simples: o Greg estava mais preocupado em tornar o NuttX o melhor sistema operacional disponível para microcontroladores de baixo custo ao invés de ficar fazendo propaganda. Felizmente, por seus próprios méritos, o NuttX está se tornando cada vez mais conhecido e utilizado, graças à qualidade do sistema e aos inúmeros recursos que ele possui. Por exemplo, a recente adição do suporte a 6LoWPAN torna o NuttX uma ótima opção para dispositivos IoT complexos onde recursos de comunicação mais sofisticados são necessários.

Como começar a usar o NuttX

E então, gostou de conhecer o NuttX? Quer aprender a usá-lo? Existem vários tutoriais espalhados pela Internet, links podem te ajudar:

Mas a forma mais simples é seguir os vídeo tutoriais (em inglês) que o Alan Carvalho de Assis está criando no NuttX Channel.

E em breve também estará disponível uma versão do canal em Português aqui.

Para seguir os vídeo tutoriais você só precisará de uma plaquinha BluePill (STM32F103 Minimum) que custa menos de U$ 2:

Placa BluePill com STM32F103
Figura 2 – Placa BluePill

E de um programador ST-Link V2 que também custa menos de U$ 2:

Programador ST-Link V2
Figura 3 – Programador ST-Link V2

Se você possuir uma das mais 150 placas suportadas pelo NuttX poderá utiliza-la, mas terá que adicionar algumas linhas de código para indicar quais dispositivos deseja inicializar. Estes dispositivos já estão inicializados na placa stm32f103-minimum, pois ela é a placa de baixo custo usada nos vídeo tutoriais.

Um agradecimento especial ao Djames Suhanko, Marcelo Barros e Fábio Souza  que deram apoio para a escrita desse artigo.

Referências

What is the NuttX RTOS and why should you care?