Configurando Ferramentas de Depuração para o ESP32

A depuração é uma etapa essencial no desenvolvimento de qualquer projeto de software ou hardware. Quando trabalhamos com o ESP32, um microcontrolador poderoso e versátil, ter ferramentas de depuração eficazes pode fazer toda a diferença entre um projeto bem-sucedido e horas de frustração. Neste artigo, exploraremos como configurar e utilizar ferramentas de depuração para o ESP32, permitindo que você entenda melhor o funcionamento interno do seu código e resolva problemas de forma mais eficiente.

Por que Usar Ferramentas de Depuração?🔗

Antes de mergulharmos na configuração, é importante entender por que a depuração é tão crucial:

  • Identificação de Erros: Ferramentas de depuração ajudam a identificar e corrigir erros no código que podem não ser aparentes apenas pela leitura do código-fonte.
  • Compreensão do Fluxo de Programa: Ao depurar, você pode acompanhar o fluxo do programa em tempo real, entendendo como diferentes partes interagem.
  • Performance Otimizada: A depuração permite identificar gargalos e otimizar o desempenho do seu aplicativo.

Requisitos Básicos🔗

Para seguir este guia, você precisará de:

  • Um ESP32.
  • Um cabo USB para conectar o ESP32 ao computador.
  • Ambiente de desenvolvimento configurado (por exemplo, Arduino IDE, Visual Studio Code com PlatformIO ou ESP-IDF).
  • Um adaptador USB para Serial (em alguns casos).
  • Conhecimento básico de programação em C/C++.

Depuração com Mensagens Serial🔗

A forma mais simples de depurar um código no ESP32 é usando mensagens serial. Embora não seja uma ferramenta de depuração avançada, é eficaz para muitos casos.

Configurando a Porta Serial

No seu código, é necessário inicializar a comunicação serial:

void setup()
{
  Serial.begin(115200);
}

Isso inicializa a comunicação serial a uma taxa de 115200 bps.

Usando Mensagens Serial

Você pode inserir mensagens no seu código para verificar valores de variáveis ou o fluxo de execução:

void loop()
{
  Serial.println("Iniciando loop...");
  int valor = analogRead(34);
  Serial.print("Valor lido: ");
  Serial.println(valor);
  delay(1000);
}

Limitações

  • Intrusivo: Adicionar múltiplas mensagens pode tornar o código confuso.
  • Timing: A comunicação serial é lenta comparada à velocidade do microcontrolador, podendo afetar o comportamento do programa.

Depuração com GDB e OpenOCD🔗

Para uma depuração mais robusta, podemos usar ferramentas como o GDB (GNU Debugger) em conjunto com o OpenOCD (Open On-Chip Debugger).

O que é o GDB?

O GDB é uma poderosa ferramenta que permite:

  • Acompanhar a execução do programa passo a passo.
  • Inspecionar e modificar o valor de variáveis em tempo real.
  • Configurar breakpoints e watchpoints.

O que é o OpenOCD?

O OpenOCD é um software que permite a comunicação entre o GDB e o microcontrolador, utilizando protocolos como JTAG ou SWD.

Configurando o Ambiente

Hardware Necessário

Para utilizar o GDB e o OpenOCD com o ESP32, você precisará de um debugger JTAG. Um exemplo popular é o ESP-Prog.

Imagem de um ESP-Prog conectado a um ESP32

Conectando o ESP-Prog ao ESP32

Conecte os pinos correspondentes do ESP-Prog aos pinos JTAG do ESP32:

  • ESP-Prog VTG ao 3.3V do ESP32
  • GND ao GND
  • TMS ao GPIO14
  • TCK ao GPIO13
  • TDO ao GPIO15
  • TDI ao GPIO12

Instalando o OpenOCD

Baixe e instale a versão do OpenOCD compatível com o ESP32. A Espressif fornece uma versão modificada que suporta o ESP32.

Configurando o GDB

O GDB geralmente é instalado junto com o ESP-IDF. Certifique-se de que o xtensa-esp32-elf-gdb está disponível no seu PATH.

Iniciando a Depuração

Passo 1: Iniciar o OpenOCD

Abra um terminal e execute:

openocd -f interface/ftdi/esp32_devkitj_v1.cfg -f board/esp32-wrover.cfg

Isso inicia o OpenOCD com a configuração apropriada para o ESP32.

Passo 2: Iniciar o GDB

Em outro terminal, navegue até o diretório do seu projeto e execute:

xtensa-esp32-elf-gdb -x gdbinit build/nomedoseuprograma.elf

No arquivo gdbinit, inclua:

target remote :3333

Passo 3: Usando o GDB

No GDB, você pode executar comandos como:

  • break main: Define um breakpoint na função main.
  • continue: Continua a execução até o próximo breakpoint.
  • step: Avança uma linha no código.
  • print variable: Exibe o valor de uma variável.

Depuração com Visual Studio Code e Espressif IDF🔗

O Visual Studio Code (VSCode) é um ambiente de desenvolvimento leve e extensível. Com a extensão apropriada, podemos integrar a depuração diretamente no editor.

Instalando Extensões Necessárias

  • Espressif IDF Extension: Fornece suporte ao ESP32.
  • C/C++ Extension Pack: Fornece recursos avançados para código em C/C++.

Configurando o Ambiente

Passo 1: Configurar o ESP-IDF

Siga as instruções para configurar o ESP-IDF no VSCode. Certifique-se de que as variáveis de ambiente estão corretamente definidas.

Passo 2: Configurar o Launch.json

No VSCode, crie ou edite o arquivo .vscode/launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "espidf",
      "name": "Espressif: ESP32 debug",
      "request": "launch",
      "program": "${workspaceFolder}/build/nomedoseuprograma.elf",
      "cwd": "${workspaceFolder}",
      "env": {},
      "externalConsole": false,
      "stopOnEntry": false,
      "debugPort": 3333,
      "console": "integratedTerminal"
    }
  ]
}

Passo 3: Iniciar a Depuração

  • Inicie o OpenOCD conforme explicado anteriormente.
  • No VSCode, vá para a aba de depuração e inicie a sessão.

Usando os Recursos de Depuração

Com a interface visual do VSCode, você pode:

  • Definir breakpoints clicando ao lado das linhas de código.
  • Inspecionar o valor de variáveis ao passar o mouse sobre elas.
  • Controlar a execução com botões de play, pause, step over, step into, etc.
Captura de tela do VSCode em uma sessão de depuração

Depuração Remota com Wi-Fi🔗

O ESP32 permite a depuração remota usando a rede Wi-Fi, o que pode ser útil em situações onde o acesso físico ao dispositivo é limitado.

Usando o GDBStub

O GDBStub é uma funcionalidade que permite que o ESP32 se comunique com o GDB através da rede.

Passo 1: Habilitar o GDBStub no Código

Inclua a biblioteca do GDBStub:

#include "esp_debug_helpers.h"

Inicie o GDBStub no seu código:

void app_main()
{
  esp_dbg_stubs_init();
  // Seu código aqui
}

Passo 2: Configurar o GDB para Conexão Remota

No GDB, conecte ao ESP32 via TCP/IP:

target remote 192.168.1.100:1234

Substitua 192.168.1.100 pelo IP do seu ESP32.

Limitations

  • Desempenho: A depuração via Wi-Fi pode ser mais lenta.
  • Complexidade: Configurar o GDBStub pode ser mais complexo e menos estável que a depuração via JTAG.

Dicas para uma Depuração Eficiente🔗

  • Simplifique o Código: Isolar o problema em um código menor facilita a identificação do erro.
  • Anote Suas Alterações: Mantenha um registro das mudanças para evitar confusão.
  • Conheça Suas Ferramentas: Invista tempo em aprender os comandos e recursos disponíveis na ferramenta de depuração escolhida.

Conclusão🔗

Configurar ferramentas de depuração para o ESP32 pode parecer desafiador no início, mas os benefícios superam em muito o esforço inicial. Com a depuração adequada, você ganha uma janela para o funcionamento interno do seu aplicativo, permitindo identificar e resolver problemas de forma eficiente.

Seja através de mensagens serial, uso do GDB e OpenOCD, ou até mesmo depuração remota via Wi-Fi, as ferramentas estão ao seu alcance. Escolha a que melhor se adapta às suas necessidades e comece a explorar todo o potencial do ESP32 em seus projetos de automação e IoT.

Este artigo faz parte do grupo Configurando o Ambiente de Desenvolvimento para ESP32
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Artigos Relacionados