Configurações Essenciais
1. Modificando o launch.json
O arquivo launch.json é fundamental para nossa configuração de depuração. O conteúdo JSON deve ser substituído pelo seguinte:
Pontos importantes:
- O WSL geralmente não inclui GDB por padrão. É necessário instalar
sudo apt install gdb-multiarche especificar/usr/bin/gdb-multiarchna configuração. - A depuração deve carregar o arquivo
.elf(com tabela de símbolos). Nunca carregue.bin, pois o GDB retornará o erroNo executable file specified. - Não configure
miDebuggerServerAddressno JSON. Isso causará conflitos, pois o VS Code tentará conectar antes dossetupCommands. A conexão deve ser feita manualmente emsetupCommands. - Inicialização manual da SDRAM: Este é um desafio comum em depuração de sistemas embarcados. O código é baixado para a SDRAM (
0x30000000), mas antes do download, o controlador SDRAM não está inicializado, causando falha na gravação. É necessário configurar os registradores viamonitor mwwantes doload.
{
"version": "0.2.0",
"configurations": [
{
"name": "Depurar Placa Mini2440 (Estável)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/projeto.elf",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb-multiarch",
"targetArchitecture": "arm",
"setupCommands": [
{ "text": "target extended-remote 127.0.0.1:3333" },
{ "text": "monitor reset halt" },
{ "text": "monitor mww 0x48000000 0x22121110" },
{ "text": "monitor mww 0x4800001c 0x00018005" },
{ "text": "monitor mww 0x48000020 0x00018005" },
{ "text": "monitor mww 0x48000024 0x009604f4" },
{ "text": "monitor mww 0x48000028 0x00000032" },
{ "text": "monitor mww 0x4800002c 0x00000030" },
{ "text": "monitor mww 0x48000030 0x00000030" },
{ "text": "monitor mww 0x53000000 0x00000000" },
{ "text": "monitor mww 0x56000010 0x00155550" },
{ "text": "file ${workspaceFolder}/build/projeto.elf" },
{ "text": "load" },
{ "text": "break main" }
],
"stopAtEntry": false,
"externalConsole": false
}
]
}
2. Atalhos
| Ação | Atalho VS Code | Comando OpenOCD (Telnet) | Comando GDB (Console de Depuração) |
|---|---|---|---|
| Pausar | F6 / Botão Pausar | halt |
-exec interrupt |
| Continuar | F5 / Botão Play | resume |
-exec c |
| Passo sobre | F10 | step |
-exec n |
| Passar dentro | F11 | step |
-exec s |
| Reiniciar | Ctrl+Shift+F5 | reset |
-exec monitor reset |
Técnicas de Depuração
Conectar o hardware é apenas o primeiro passo. O uso eficaz das ferramentas para identificar bugs é fundamental. Abaixo estão algumas técnicas úteis:
Conecte sua placa hardware. Para dúvidas sobre esta parte, consulte o artigo anterior sobre configuração do ambiente de depuração.
No prompt de comando, use o comando openOCD:
openocd -f interface/jlink.cfg -f board/mini2440.cfg
Pressione F5 no VS Code para iniciar a depuração. A parte inferior da interface mudará para laranja.
1. Operação Direta de Registradores
Para verificar se o circuito dos LEDs está funcionando corretamente ou testar o efeito de uma configuração específica de registrador, não é necessário modificar o código e recompilar.
No Console de Depuração (Debug Console), digite:
# Exemplo: Escrever 0 em GPBDAT (0x56000014) para acender todos os LEDs
-exec set {int}0x56000014 = 0
Você verá todos os LEDs da placa se acendendo instantaneamente.
2. Modificação de Variáveis em Tempo de Execução
Ao testar condições de limite em lógica de loop (como um loop de 100 iterações), não é necessário pressionar F10 100 vezes.
- Coloque um ponto de pausa dentro do loop e pare a execução.
- Nova janela "Monitoramento" (Watch) ou no console, altere o valor da variável do loop (por exemplo,
i) de 0 para 100. - Continue a execução; o programa executará diretamente a lógica da última iteração.
3. Solução para Impossibilidade de Pausar o Programa
O VS Code tem um bug em depuração embarcada: quando o programa está em execução contínua em um loop infinito (CPU a 100%), clicar no botão "Pausar" geralmente não funciona, resultando no erro Unable to perform this action.
Solução: Contornar o VS Code e enviar comandos diretamente para o OpenOCD.
- Abra uma nova janela de prompt de comando como administrador (mantenha a sessão anterior do OpenOCD ativa).
- Instale o cliente Telnet com o comando:
dism /online /Enable-Feature /FeatureName:TelnetClient
- Após a instalação, na mesma janela de comando, digite:
telnet localhost 4444
- No prompt Telnet, insira:
halt
Este comando força a suspensão da CPU, recuperando o controle. A execução provavelmente será interrompida dentro de uma rotina de atraso.
Use o comando resume para retomar a execução:
resume
4. Depuração em Assemb e Ponteiro SP
Se o programa travar ao entrar na função main (erro 0x80004004), geralmente é devido a um código de inicialização (startup.S) incorreto, resultando em um ponteiro de pilha (SP) inválido.
- Dica: No VS Code, clique com o botão direito na área do código e selecione "Abrir Visualização de Desmontagem (Open Disassembly View)".
- Use F10 para executar instruções assembly passo a passo.
- No painel Registradores (Registers), observe o R13 (SP) e certifique-se de que, antes de pular para o código C, o SP aponta para um endereço RAM válido.
5. Monitoramento Avançado
- Visualização Hexadecimal: Na janela de monitoramento à esquerda, adicione expressões para visualizar valores em hexadecimal ou binário usando
x(hex) eb(bin).
*(volatile int*)0x56000014,x
*(volatile int*)0x56000014,b
- Pontos de pausa de dados: Para descobrir quem está modificando uma variável global, no Console de Depuração, digite o comando. Se alguém modificar o valor no endereço especificado, o programa pausará automaticamente.
-exec watch *0x56000014
- Pontos de pausa condicionais: Após criar um ponto de pausa, clique com o botão direito e edite-o. Insira uma expressão lógica (por exemplo,
i == 8para pausar quandoifor igual a 8).
Problemas Comuns e Soluções
P: Por que cada pausa (Halt) para na função delay?
R:
Este é um comportamento estatístico. A CPU passa 99,9% do tempo executando loops vazios de delay e apenas 0,1% do tempo operando em I/O. Uma pausa aleatória quase certamente encontrará a CPU "descansando". Para ver operações de I/O, coloque pontos de pausa específicos nas linhas relevantes.
P: Por que o console de depuração exibe o erro "unable to create variable object"?
R:
Ao inserir comandos nativos do GDB no console, é necessário prefixá-los com -exec (por exemplo, -exec info reg). Caso contrário, o VS Code tentará interpretar o comando como uma variável de linguagem C.
Conclusão
O desenvolvimento embarcado com VS Code + WSL permite aproveitar o poderoso ecossistema de linha de comando do Linux, mantendo a experiência confortável de GUI do Windows. Embora a configuração inicial possa ser complexa, uma vez compreendida a integração entre OpenOCD e GDB, combinada com as técnicas de depuração mencionadas, você terá o poder de controlar o hardware a nível fundamental.
Esperamos que este artigo ajude a evitar armadilhas e permita aproveitar a satisfação do desenvolvimento de sistemas embarcados!