
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 Operacional | Governança | Licença de Uso | Contribuições Feitas em Junho de 2024 |
---|---|---|---|
Zephyr | Comunidade | Apache 2.0 | 942 |
NuttX | Comunidade | Apache 2.0 | 135 |
RIOT | Comunidade | LGPL 2.1 | 71 |
RT-Thread | Comunidade | Apache 2.0 | 67 |
Tizen RT | Samsung | Apache 2.0 | 36 |
Mynewt | Comunidade | Apache 2.0 | 25 |
Mbed OS | Arm | Apache 2.0 or BSD-3 Clause | 7 |
FreeRTOS | Richard Barry | MIT | 6 |
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
⚠️
Todo o processo de instalação foi realizado no Ubuntu 24.04. Verifique a documentação oficial do NuttX para outros sistemas operacionais.
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
⚠️
Você vai precisar ter o ambiente virtual do Python instalado. Utilize esse comando para instalar: sudo apt install python3.12-venv
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.
💡
Como a mesma toolchain pode ser utilizada em vários projetos diferentes, você pode instalar ela no diretório raiz do seu usuário, como eu vou fazer
> 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
⚠️
Você vai precisar ter o curl instalado para realizar os próximos passos. Você pode instalar ele com o comando: sudo apt install curl
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.
⚠️
Você vai precisar ter o picocom instalado para realizar os próximos passos. Você pode instalar ele com o comando: sudo apt install picocom
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:

Informação Importante

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.
Deixe um comentário