Fonte: NuttX

O NuttX é um sistema operacional de tempo real (RTOS) compatível com POSIX, amplamente utilizado em sistemas embarcados. Neste guia, exploramos o processo de instalação e configuração do NuttX no microcontrolador ESP32-S3.

Introdução ao Apache NuttX

O Apache NuttX é um sistema operacional de tempo real (RTOS) projetado para ser leve e estar em conformidade com padrões, em especial o POSIX e o ANSI, fornecendo interfaces semelhantes às usadas por aplicativos Embedded Linux para SoCs que não exigem a execução direta do Linux.

Ele oferece uma estrutura modular e suporta múltiplos drivers, sistemas de arquivos e protocolos de rede, sendo uma opção interessante para quem deseja um sistema mais próximo do ambiente UNIX em um microcontrolador, especialmente para projetos que exigem maior modularidade e suporte a múltiplos processos.

Segundo a pesquisa apresentada pelo Alin Jerpelea na NuttX Workshop 2024 (a tabela aparece aos 53 segundos do vídeo), e baseada em comunidade, o NuttX é o segundo RTOS mais popular, atrás apenas do Zephyr. Aqui está uma versão reduzida da tabela que ele apresentou:

Sistema OperacionalGovernançaLicença de UsoContribuições Feitas
em Junho de 2024
ZephyrComunidadeApache 2.0942
NuttXComunidadeApache 2.0135
RIOTComunidadeLGPL 2.171
RT-ThreadComunidadeApache 2.067
Tizen RTSamsungApache 2.036
MynewtComunidadeApache 2.025
Mbed OSArmApache 2.0 or BSD-3 Clause7
FreeRTOSRichard BarryMIT6

A NuttX oferece suporte a mais de 300 placas de diferentes arquiteturas e sua comunidade ativa continua fornecendo suporte para dispositivos e placas mais novos. incluindo as famílias ESP32, ESP32-C e ESP32-S da Espressif Systems.

Baixando o NuttX

O processo de instalação do NuttX descrito abaixo foi baseado no da publicação “Introdução ao NuttX e ESP32“, disponível no Espressif Developer Portal;

Instalando as Dependências do NuttX

Primeiro precisamos instalar as dependências do próprio NuttX via terminal.

> sudo apt install -y \
automake binutils-dev bison build-essential flex g++-multilib gcc-multilib \
genromfs gettext git gperf kconfig-frontends libelf-dev libexpat-dev \
libgmp-dev libisl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev \
xxd libtool picocom pkg-config python3-pip texinfo u-boot-tools util-linux

Além dessas, também é preciso instalar a biblioteca python kconfiglib via pip. Para simplificar o processo e evitar problemas com outros projetos instalados, eu recomendo que você crie uma pasta para esse projeto, e também um Ambiente Virtual do Python dentro dela, onde serão instaladas algumas das dependências.

> mkdir ~/nuttx-esp32s3
> cd ~/nuttx-esp32s3
> python3 -m venv ambiente-virtual
> source ambiente-virtual/bin/activate
> pip install kconfiglib

Ferramentas e Toolchains da Espressif

Quando as dependências do NuttX estiverem instaladas, é hora de instalar as ferramentas de compilação da Espressif. A primeira delas é a esptool, que vai permitir a comunicação com os microcontroladores.

> pip install esptool

Agora precisamos instalar a toolchain para o microcontrolador. Atualmente, os SoCs da Espressif suportados pelo NuttX são divididos em duas arquiteturas diferentes: RISC-V e Xtensa.

RISC-V:

  • ESP32-C3
  • ESP32-C6

Xtensa:

  • ESP32
  • ESP32-S2
  • ESP32-S3

Todos os SoCs RISC-V usam a mesma toolchain, mas você pode conferir mais detalhes sobre ela na seção “ESP32-C3 Toolchain” da documentação do NutteX.

Cada SoCs baseado em Xtensa tem sua própria toolchain, que precisa ser baixada e configurada separadamente. Como vamos utilizar um ESP32-S3, vamos seguir o que está na seção “ESP32-S3 Toolchain” da documentação do NutteX.

> mkdir -p ~/xtensa-esp32s3-elf-gcc
> cd ~/xtensa-esp32s3-elf-gcc
> wget https://github.com/espressif/crosstool-NG/releases/download/esp-12.2.0_20230208/xtensa-esp32s3-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz
> tar -xf xtensa-esp32s3-elf-12.2.0_20230208-x86_64-linux-gnu.tar.xz

Depois de extrair os arquivos da toolchain, precisamos adicionar a localização dos binários dela a variável PATH, em seguida feche esse terminal.

> export PATH=$HOME/xtensa-esp32s3-elf-gcc/xtensa-esp32s3-elf/bin:\$PATH
> exit

Para verificar se deu certo, abra um novo terminal e execute os seguintes comandos:

> cd ~/nuttx-esp32s3
> source ambiente-virtual/bin/activate
> xtensa-esp32s3-elf-gcc --version

Baixando o NuttX

Para baixar o NuttX, basta clonar o seu repositório no GitHub na pasta do nosso projeto. Também vou baixar o repositório nuttx-apps, mas é apenas para podermos rodar uma aplicação de exemplo.

> cd ~/nuttx-esp32s3
> git clone https://github.com/apache/nuttx.git nuttx
> git clone https://github.com/apache/nuttx-apps.git apps

Instalando o NuttX no ESP32

Com o NuttX na pasta do projeto, podemos fazer uma simples configuração de Wi-Fi para conferir seu funcionamento. O NuttX fornece algumas configurações padrão que você só precisa selecionar e usar, como é o caso do Wi-Fi que vamos utilizar. Para utilizar essas configurações você precisa ter baixado o repositório nuttx-apps no passo anterior.

Buscando por Configurações Padrão

Vamos acessar o diretório do NuttX e verificar quais são as configurações disponíveis para a placa ESP32-S3 DevKit. Você pode encontrar mais informações sobre essa placa clicando aqui.

> cd ~/nuttx-esp32s3/nuttx
> ./tools/configure.sh -L | grep esp32s3-devkit

Se deu tudo certo, você recebeu uma série de configurações disponíveis para essa placa, incluindo a que vamos utilizar, que é a “esp32s3-devkit:wifi“.

Encontrando a Porta Serial

Conecte a placa ao seu computador e verifique qual foi a porta serial que foi associada a ela com o comando:

> ls /dev/tty*

No meu caso, a placa está na porta /dev/ttyACM0, mas isso não é uma regra, e você deve sempre verificar qual porta serial foi associada a sua placa.

Agora você deve garantir que o seu usuário tenha permissão de leitura e gravação na porta serial que foi associada a sua placa. Isso pode ser feito dando, temporariamente, todas as permissões para essa porta serial com o seguinte comando:

> sudo chmod 777 /dev/ttyUSB0

Configurando o NuttX

Como vamos utilizar a configuração padrão de Wi-Fi para a placa ESP32-S3 DevKit nesse exemplo, precisamos carregar ela com o seguinte comando:

> ./tools/configure.sh esp32s3-devkit:wifi

Caso você queira, o utilitário menuconfig permite que você faça alterações nas configurações do projeto, como habilitar periféricos, modificar as configurações do kernel, habilitar o suporte para drivers de dispositivos, configurar o NuttShell e o sistema de arquivos e etc. No nosso caso, vamos utilizar para configurar as credenciais de Wi-Fi.

> make menuconfig

Para que a placa se conecte à sua rede Wi-Fi, navegue até a seção WAPI Configuration, acessível em Application Configuration -> Network Utilities -> Network Initialization -> WAPI Configuration, e defina o SSID e a senha com o nome e a senha, respectivamente, da sua rede Wi-Fi.

Também é necessário configurar a forma como a placa vai obter um endereço IP válido depois de se conectar a rede Wi-Fi. Nesse caso, vou utilizar o serviço de DHCP do próprio roteador. Para isso, basta selecionar a opção Use DHCP to get IP address na seção IP Address Configuration, acessível em Application Configuration -> Network Utilities -> Network Initialization -> IP Address Configuration.

Por último, confira se a placa que você está utilizando a mesma que está configurada na seção ESP32-S3 Chip Selection, acessível em System Type -> ESP32-S3 Chip Selection. No meu caso, é o ESP32-S3-WROOM-1-N16R8.

Ao concluir as configurações, basta pressionar o botão “S”, no teclado, para salvar as alterações, e em seguida o botão “Q” para fechar o menuconfig.

Carregando o NuttX na Placa

Para carregar o NuttX para a placa, precisamos compilar o bootloader responsável por inicializar ele. Com o bootloader pronto, podemos limpar a memória flash da placa e carregar o NuttX.

> make bootloader
> make clean
> esptool.py --port /dev/ttyUSB0 erase_flash
> make flash ESPTOOL_PORT=/dev/ttyUSB0 ESPTOOL_BINDIR=./

Testando a Conexão Wi-Fi.

Agora que o NuttX já foi carrega para a placa, podemos abrir um console serial utilizando o picocom a partir do seguinte comando:

> picocom -b115200 /dev/ttyUSB0

Para conferir se deu tudo certo podemos utilizar dois comandos. O primeiro é o ifconfig que vai mostrar os dados sobre as interfaces de rede. O segundo comando é o wapi scan wlan0, que vai fazer uma busca por redes Wi-Fi disponíveis na interface wlan0 da placa.

> ifconfig
> wapi scan wlan0

Você deve ter um resultado semelhante a esse aqui:

Fonte: O Autor

Informação Importante

Fonte: O Autor

Na teoria, essas duas placas são o mesmo SoC, o ESP32-S3 N16R8. Porém, por algum motivo que eu não consegui identificar, a placa da direita não consegue rodar o NuttX devido a um erro constante durante o boot da placa.

Vou continuar realizando testes em busca de detectar o problema. Assim que eu tiver alguma atualização sobre o problema eu atualizo essa publicação.

Conclusão

Apesar de alguns desafios encontrados, como a incompatibilidade de uma das placas ESP32-S3 com o NuttX, o processo geral foi bem-sucedido, permitindo a conexão à rede Wi-Fi e a execução de comandos básicos de rede. Isso demonstra o potencial do NuttX para ser utilizado em uma variedade de aplicações, desde dispositivos IoT até sistemas mais complexos que exigem um ambiente semelhante ao UNIX.

Para quem está começando com o NuttX ou com o ESP32-S3, este guia oferece um ponto de partida sólido. No entanto, é importante lembrar que a comunidade do NuttX está sempre evoluindo, e novas atualizações e correções podem surgir. Portanto, recomenda-se acompanhar a documentação oficial e os fóruns da comunidade para obter as informações mais recentes.

Se você tiver alguma dúvida ou quiser compartilhar sua experiência com o NuttX e o ESP32-S3, sinta-se à vontade para deixar um comentário abaixo. Sua contribuição é valiosa para enriquecer a discussão e ajudar outros desenvolvedores que estão embarcando nessa jornada.

Para citar esse artigo:

GUERRA DA SILVA, L. R. Instalando o NuttX no ESP32-S3. Ciência Embarcada. Recife. 18 mar. 2025. Disponível em: https://cienciaembarcada.com.br/publicacoes/instalando-o-nuttx-no-esp32-s3/. Acesso em: 14 jun. 2025.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Lucas Guerra

Autista e entusiasta do mundo da tecnologia. Criei esse blog para poder compartilhar conhecimentos e experiências de forma acessível, traduzindo esse infinidades de termos da tecnologia. Eu trabalho com o desenvolvimento de dispositivos IoT e Sistemas Web, indo do desenho de PCBs até a interface com o usuário, e sempre com foco em segurança e inovação.