Configurando Depuração para Mini2440 com VS Code, WSL e OpenOCD

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-multiarch e especificar /usr/bin/gdb-multiarch na configuração.
  • A depuração deve carregar o arquivo .elf (com tabela de símbolos). Nunca carregue .bin, pois o GDB retornará o erro No executable file specified.
  • Não configure miDebuggerServerAddress no JSON. Isso causará conflitos, pois o VS Code tentará conectar antes dos setupCommands. A conexão deve ser feita manualmente em setupCommands.
  • 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 via monitor mww antes do load.
{
    "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) e b (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 == 8 para pausar quando i for 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!

Tags: VS Code WSL OpenOCD Mini2440 depuração embarcada

Publicado em 7-17 17:58