Zephyr RTOS – Debugando uma aplicação no ESP32 com o ESP-Prog

O Zephyr OS é um RTOS de baixo footprint, com suporte para diversas arquiteturas, com foco em dispositivos embarcados e com baixos recursos. Ele é mantido pela Linux Foundation e possui adesão de grandes fabricantes, como Intel, Nordic, Google, Meta, Qualcomm, etc.

Para uma lista completa dos membros ativos do projeto, visite o site oficial.

Você pode encontrar mais detalhes sobre o RTOS na página da documentação do Zephyr OS.

A Espressif vem trabalhando para ampliar o suporte aos seus SoCs no Zephyr OS. Além do famoso ESP32, também existe suporte atualmente ao ESP32-S2 e ESP32-C3. Para entender como está o suporte atual para os SoCs da Espressif, recomendo o seguinte artigo (em inglês).

Neste artigo usarei a placa ESP32 DevKitC e o ESP-Prog da Espressif. Vamos ver como configurar seu ambiente de desenvolvimento, compilar uma aplicação que irá utilizar o PWM do ESP32 para piscar um LED, gravar sua placa de desenvolvimento e depurar ela utilizando o JTAG através do OpenOCD.

OpenOCD no Zephyr

O Open On-Chip Debugger (OpenOCD) é uma aplicação open source que implementa um servidor GDB remoto para uma variedade bem grande de dispositivos embarcados. Os módulos ESP32 precisam de alguns patches que não estão disponíveis na upstream do projeto. Por essa razão a Espressif mantém uma versão própria do repositório.

ESP-PROG

O ESP-Prog é uma ferramenta de desenvolvimento e depuração da Espressif que possui as funcionalidades de download automático do firmware, comunicação serial e depuração JTAG.

O ESP-Prog se conecta ao PC por apenas um cabo USB. O PC reconhece duas portas distintas, uma para download do firmware e outra para depuração JTAG.

Conhecendo a ESP-Prog

ESP-Prog
Figura 1 – ESP-prog – Fonte: https://espressif-docs.readthedocs-hosted.com/projects/espressif-esp-iot-solution/en/latest/hw-reference/ESP-Prog_guide.html

USB Bridge

O ESP-Prog usa o FT2232HL, fornecido pela FTDI, como a ponte controladora USB. A placa pode ser configurada para converter o USB 2.0 para interfaces seriais e paralelas que são padrão de industria.

Interface de Comunicação

O ESP-Prog pode se conectar com a ESP32 utilizando tanto a interface de programação, quanto a JTAG.

Interface de Programação

A interface possui 6 pinos, incluindo a UART (TX e RX), pino de seleção do modo de boot (ESPIO0) e pino de reset (ESPEN).

ESP-Prog
Figura 2 – Interface de programação – Fonte: https://espressif-docs.readthedocs-hosted.com/projects/espressif-esp-iot-solution/en/latest/hw-reference/ESP-Prog_guide.html

Interface JTAG

A interface JTAG possui a seguinte configuração de pinos:

ESP-Prog
Figura 3 – Interface JTAG – Fonte: https://espressif-docs.readthedocs-hosted.com/projects/espressif-esp-iot-solution/en/latest/hw-reference/ESP-Prog_guide.html

Seleção de Tensão de Operação

Os jumpers localizados ao lado das interfaces, tanto a de programação, quanto a de JTAG fazem a seleção da tensão de operação, podendo ser selecionado 3.3V ou 5V.

Preparando o Hardware

Neste artigo vamos usar o ESP-Prog somente para fazer a depuração através do JTAG de uma aplicação PWM. Portanto, será necessário conectar o ESP-Prog ao ESP32 através da interface JTAG e um LED na nossa placa. Será necessário a utilização de dois cabos USB. Um para o ESP-Prog e outro para alimentar e gravar o ESP32.

ESP-Prog

Conecte os pinos da interface na DevKitC seguindo a tabela abaixo:

Tabela 1 – Conexão entre JTAG e DevKitC

ESP32Conector JTAGSinal JTAG
GND3Terra Digital
IO142Test Mode State
IO134JTAG return Test Clock
IO156Test Data Out
IO128Test Data In

Selecione a tensão de operação para 3.3V no jumper localizado ao lado do conector JTAG.

LED

Se a sua placa já vem com um LED montado, muito provavelmente ele estará conectado internamente ao pino 2, portanto esse passo não é necessário.

A DevKitC não possui um LED montado de fábrica, portanto devemos conectar um resistor (100 Ω a 1 kΩ) no pino 2 (IO2) da placa. O outro polo do resistor deve ir ao ânodo do Led (polo positivo), enquanto o cátodo (polo negativo) deve ser conectado ao GND da placa.

Figura 4 – Circuito para teste

Obtendo o Zephyr OS

Caso você não tenha o Zephyr OS baixado em sua máquina, é só seguir os passos descritos na página oficial (Getting Started Guide). Seguindo esses passos você vai obter o código do Zephyr OS, a ferramenta WEST e o SDK do Zephyr. Após completar o guia, podemos dar continuidade instalando as ferramentas da Espressif.

Instalando as ferramentas da espressif

O HAL da Espressif no Zephyr OS precisa de alguns binários e outros utilitários para funcionar corretamente, como a versão da Espressif do OpenOCD. O comando a seguir executa todos os passos necessários para obtenção dessas ferramentas:

Por padrão, o OpenOCD com suporte para as placas da espressif fica localizado em $HOME/.espressif/tools/zephyr.

Firmware

Neste artigo vamos utilizar a sample blinky_pwm, que já vem incluída na árvore do Zephyr como um dos exemplos. A pasta do projeto está localizada em samples/basic/blinky_pwm/

Arquivo de configuração

Antes de compilar nosso exemplo e gravar na nossa placa, vamos inserir uma opção do Zephyr de build otimizado para debug. No arquivo *samples/basic/blinky_pwm/prj.conf*, insira a linha:

Build, Flash e Monitor

Agora podemos compilar nosso exemplo passando algumas informações sobre o OpenOCD. Vá para a pasta raiz do projeto (~/zephyrproject/zephyr) execute o comando de build:

O Zephyr, por padrão, usa sua própria versão do OpenOCD. Precisamos portanto especificar para ele qual OpenOCD usar. Neste caso, queremos aquela com suporte às placas da Espressif.

Se a compilação for bem sucedida, você verá algo assim no terminal:

Para gravar o binário na placa, basta executar o comando:

A mensagem no terminal será algo como:

Para acessar a serial da sua ESP32 o seguinte comando pode ser usado:

Resultando na seguinte mensagem no terminal em caso de sucesso:

Você verá seu LED piscando em frequências que irão aumentar a cada 4 segundos. Ele começa a piscar lentamente e vai aumentando sua frequência gradativamente até chegar em algum limite e voltar a diminuir a frequência de forma cíclica. Você pode perceber que nenhuma informação sobre o período configurado no PWM é indicado no console. Vamos descobrir quais valores estão sendo configurados através de uma sessão GDB utilizando o ESP-Prog.

Debugando a placa

Agora vamos debugar nossa placa utilizando o ESP-Prog. Para sair do monitor, pressiona as teclas ctrl + ] e execute o comando:

Várias mensagens irão aparecer. Se necessário, pressione ENTER até chegar em algo como:

O Zephyr automaticamente coloca um breakpoint na função main(). Os breakpoints são lugares (linhas ou funções) onde o programa para a execução e espera por um comando seu (para imprimir variáveis, para executar uma linha por vez, etc). Tal como a shell de Linux, o GDB é um programa interativo. A tabela abaixo mostra os comandos mais comuns:

ComandoDescrição
b mainColoca um breakpoint no início da aplicação
bColoca um breakpoint na linha atual
b NColoca um breakpoint na linha N
b +NColoca um breakpoint N linhas abaixo da linha atual
b fnColoca um breakpoint no início da função “fn”
d NDeleta o breakpoint “N”
info breakLista os breakpoints
rExecuta a aplicação até um breakpoint ou erro
cContinua a execução da aplicação até um breakpoint ou erro
fExecuta até o fim da função atual
sExecuta a próxima linha (mas entra dentro de funções)
s NExecuta as próximas N linhas
nExecuta a próxima linha (não entra dentro de funções)
p varMostra o valor atual da variável “var”
display varMostra o valor da variável “var” sempre que parar
qSai do GDB
Tabela 2 – Comandos GDB

De volta para o exemplo, insira o comando continue na interface do GDB:

A partir desse ponto podemos executar nossos próprios comandos do GDB.

Vamos colocar um breakpoint na linha 61 do arquivo main.c da sample blinky_led. Nessa linha que é setado o período do sinal PWM e período do que compreende o pulso positivo:

Para isso, execute o seguinte comando:

Vamos continuar a execução do programa até ele parar no breakpoint que colocamos:

Nesse ponto podemos ver qual o valor da variável period:

A API de PWM do Zephyr recebe os valores de período em nanosegundos. Um período de 1.000.000.000 ns equivale a 1 Hz. O terceiro argumento da função pwm_set_dt() recebe o tempo do pulso positivo do PWM, que neste caso é metade do período, indicando portanto um PWM com duty cycle de 50%.

Para que o valor dela seja mostrado toda vez que pararmos em algum breakpoint podemos utilizar o comando display:

Continuando a execução do programa por alguns ciclos:

Podemos verificar através do LED e da leitura da variável que a cada iteração da aplicação o período do PWM é diminuído pela metade, dobrando a frequência com que o LED pisca.

Para sair da sessão GDB basta inserir o comando quit:

Conclusão

Vimos como obter o Zephyr OS, compilar uma aplicação, acessar a porta serial e realizar a depuração para o ESP32. Experimentamos como a infraestrutura que o Zephyr OS nos fornece simplifica esses processos através de simples comandos, bastando ter o hardware adequado. O suporte ao ESP32 e aos demais SoCs da Espressif no Zephyr OS, e em outros projetos de código aberto, vem aumentando consistentemente permitindo flexibilidade ao desenvolvedor de escolher a plataforma que mais se adequa às necessidades de seu projeto. Espero que este artigo seja instrutivo e lhe incentive a explorar mais profundamente as possibilidades que o Zephyr OS em conjunto com o ESP32 tem a oferecer.

Saiba Mais

Zephyr RTOS no ESP32 – Primeiros Passos

Blink LED no ESP32 e Zephyr RTOS

Zephyr RTOS – Instalando o Ambiente de Desenvolvimento

Referências

https://docs.zephyrproject.org/latest/boards/xtensa/esp32/doc/index.html

https://www.espressif.com/en/news/Zephyr_updates

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-devkitc.html

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/jtag-debugging/index.html

https://espressif-docs.readthedocs-hosted.com/projects/espressif-esp-iot-solution/en/latest/hw-reference/ESP-Prog_guide.html

https://man7.org/linux/man-pages/man1/gdb.1.html

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Home » Hardware » Zephyr RTOS – Debugando uma aplicação no ESP32 com o ESP-Prog
Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste: