Zephyr RTOS no ESP32 – Primeiros Passos

ESP32 zephyr
Este post faz parte da série Zephyr RTOS no ESP32. Leia também os outros posts da série:

O Zephyr é um RTOS mantido pela Linux Foundation, com baixíssimo footprint e portado para diversas arquiteturas. Este RTOS vem ganhando a adesão maciça de fabricantes de semicondutores e, recentemente, Google e Facebook tornaram-se membros Platinum do Zephyr Project [1]. Estes dois gigantes anunciaram que passarão a adotar o Zephyr como RTOS em várias de suas soluções embarcadas, sendo assim, os dois podem vir a contribur ainda mais ativamente para o projeto. Você pode encontrar explicações mais detalhadas sobre o RTOS na documentação oficial do Zephyr Project.

A Espressif vem ampliando o suporte para o Zephyr RTOS no ESP32. O ESP32 é um SoC extremamente popular entre hobbystas mas também já muito utilizado em aplicações comerciais, este SoC é conhecido por já integrar as stacks Wifi e Bluetooth em um só chip e por ser muito competitivo em termos de custo. Neste artigo, vou explicar os passos necessários para preparar o ambiente do seu host para usar o Zephyr no ESP32. Ao final, vamos rodar o clássico “hello world” para validar o seu setup. Neste passo-a-passo usarei a placa ESP32 DevKitC.

Zephyr RTOS no ESP32: ESP32-DevKitC(ESP32-WROVER-E)

A primeira coisa a se fazer é preparar o ambiente de desenvolvimento do Zephyr. Eu listo aqui brevemente os passos necessários para Linux (Ubuntu 20.04.1 LTS), para a documentação de setup mais atualizada e para o suporte a outros SOs você pode ver o Getting Started oficial do Zephyr e, em especial, a seção dedicada especificamente ao ESP32.

1. Atualizando o Linux

Antes de começarmos, atualize a sua lista de repositórios.

2. Instalando as dependências

Use apt para instalar as dependências:

Verifique a versão do cmake instalada no seu host.

Se a versão for superior à 3.13.1 vá para a próxima seção. Do contrário, siga estes passos para atualizar o cmake:

  1. Adicione a chave de assinatura da Kitware (empresa desenvolvedora do cmake).

2. Adicione o repositório apt da Kitware para o release do seu SO. No caso do Ubuntu 20.04 LTS:

3. Reinstale o cmake.

3. Obtendo o Zephyr e instalando as dependências Python

Instale o west e garanta que o caminho ~/.local/bin faz parte da sua variável de ambiente PATH:

Aqui cabe uma breve observação: west é a ferramenta que gerencia todo o ciclo de vida de um projeto baseado no Zephyr. Isto fica mais claro a seguir. Agora, obtenha o código-fonte do Zephyr:

Tenha paciência, estes últimos comandos vão buscar o repositório do Zephyr e todas as camadas HAL já portadas para este RTOS, incluindo a do ESP32. Repare que não chamamos (explicitamente) um comando git para clonar o repositórios, o west se encarrega de tudo. Agora, exporte um Zephyr CMake package. Isto faz com que o CMake carregue automaticamente códigos que facilitam o build das aplicações.

O arquivo scripts/requirements.txt do Zephyr declara dependências adicionais do Python. Faça a instalação usando pip3.

4. Instalando o Toolchain do Zephyr

O SDK do Zephyr vai adicionar várias ferramentas adicionais para o host. Faça o download do instalador do SDK:

Execute o instalador, instalando o SDK em ~/zephyr-sdk-0.11.4 :

Este é um dos diretórios padrão recomendados para a instalação do SDK, para instalar em outros locais consulte a documentação do Zephyr.

5. Adicionando o Toolchain do ESP32 ao Projeto

Antes do build, precisamos informar ao Zephyr onde encontrar o toolchain para a arquitetura Xtensa do ESP32.  Abra o terminal e digite os seguintes comandos para exportar as variáveis de ambiente necessárias ao build:

Você também pode adicionar os comandos acima ao seu arquivo ~/.bashrc se preferir. Tendo estas variáveis disponíveis a qualquer momento na sua sessão de trabalho. Em seguida, instale o toolchain:

Por padrão, o toolchain será adicionado ao diretório $HOME/.espressif

6. Fazendo o Build da Aplicação

Lembra que eu mencionei que o west participa de todas as etapas do ciclo do projeto, pois bem, vamos utilizá-lo agora também. Faça o build do projeto hello_world para o ESP32 na pasta raiz do Zephyr.

No comando de build acima “-p auto” determina a detecção automática da porta serial, enquanto “-b esp32″ seleciona nosso alvo da compilação. Na sequência, o comando busca o CMakeLists.txt presente na pasta samples/hello_world para buildar a aplicação. 


Se o build anterior falhar com uma mensagem indicando a falta de algum pacote Python, é possível que a falha seja, na verdade, devido ao uso do python2.x como padrão. Se este for o caso, faça do python3 o padrão do seu sistema com o seguinte comando:

Em seguida, rode o comando de build novamente.


Vamos precisar de um programa que se comunique com a porta serial, use o que você preferir, para ilustrar eu uso o minicom.

Para abrir a configuração do minicom digite o seguinte comando:

A comunicação serial deve estar configurada para 115200 8N1. Veja como ficam as configurações no minicom nas figuras abaixo.

7. Gravando o Binário da Aplicação

Após a etapa de build a gravação do binário é muito simples, basta o seguinte comando:

No caso das placas ESP32 DevKit mais antigas, a placa entra em estado de espera até que você aperte o botão BOOT para iniciar a gravação, as placas mais recentes já começam a gravação imediatamente. No comando anterior eu já chamei o minicom na sequência, o que não é obrigatório. Você pode chamar o minicom depois e resetar a placa via botão EN para ver o resultado. Se você seguiu tudo até aqui, após várias mensagens de boot do ESP32, você deve ver as linhas abaixo.

Pronto, você validou o seu ambiente e rodou a sua primeira aplicação usando o Zephyr no ESP32!

Conclusão

Neste artigo vimos como configurar o ambiente do Zephyr e buildar um projeto de exemplo para o ESP32, em um próximo artigo eu vou cobrir um caso de uso do Zephyr RTOS no ESP32, onde iremos escrever a nossa própria aplicação. Até lá!

Saiba mais

Como instalar o Zephyr no Ubuntu 16.04

Zephyr, o RTOS para IoT desenvolvido pela Linux Foundation

RTOS: Uso de grupo de eventos para sincronização de tarefas

Outros artigos da série

Blink LED no ESP32 e Zephyr RTOS >>