Laboratório Maker 08: JTAG JLink • Do bit Ao Byte
Laboratório Maker 08: JTAG JLink
Existem montes de dispositivos JTAG e esse que possuo é um clone JTAG JLink da Segger. Estou utilizando-o em Linux, no Kubuntu 20.10, sem precisar adicionar nada ao udev.
O JTAG é uma forma de se conectar a um circuito para fazer depuração, análise, testes, cópia de firmware, engenharia reversa e alguns itens mais.
(Não estranhe; o Laboratório Maker 08 pulou o Laboratório Maker 07 mesmo.)
CPUs suportadas pelo JTAG JLink
Esse modelo que estou apresentando tem suporta a ARM7/9/11, Cortex-A5/A8/A9, Cortex-M0/M1/M3/M4, Cortex-R4. Isso significa que podemos usá-la na Raspberry Pi Pico (M0) e na BluePill (STM32F103C -M3).
Ela suporta SWD (que utlizaremos em ambos os exemplos supracitados) e SWV.
SWD – Serial Wire Debug
SWV – Serial Wire Viewer
Sua velocidade é de até 12MHz e dopwnload de até 720KBps em um ARM7@50MHz.
Com ela podemos fazer flashing, flashing com breakpoints e o que mais me apaixona é justamente isso: Fazer breakpoints.
Para quem programa amplamente em plataforma X86, depurar código com GDB é bem comum, principalmente usando uma IDE como QTCreator ou VSCode. Se você nunca usou um debugger, meu caro, a primeira vez que experimentar será para usar pra sempre! Com esse recurso podemos adicionar breakpoints, ou seja, definir pontos de parada na MCU, de forma que invés de rodar ciclicamente, ela aguarde para executar a próxima instrução. Com isso, conseguimos ver o valor atribuído a uma variável e encontrar um ponto de falha em nosso programa através do momento da exceção. No vídeo veremos isso em detalhes, mas o vídeo pode não sair no mesmo dia do artigo. Verifique no canal DobitaobyteBrasil no Youtube.
Instalação no sistema (Linux)
Fará muito sentido quando dermos continuidade à série, mas nesse momento a recomendação é instalar os compiladores para ARM. Ou instale inicialmente esse:
Instale também o GDB. Atualmente não é necessário tê-lo para uma arquitetura específica. Instale o multiarch:
Baixe também o software da Segger para o J-Link.
sudo dpkg -i JLink_Linux_V696_x86_64.deb
Wiring JTAG STM32F103C
Agora, antes de fazermos as conexões é necessário conhecer o dispositivo minimamente. Não terá segredo, faça como está descrito aqui e deverá funcionar.
Para esse teste estou usando o ARM BluePill. Na borda da placa estão dispostos 4 pinos, sendo 3v3, SWD, SWCLK e GND. Devemos conectar os respectivos pinos do J-Link a estes pinos. Minha recomendação é a seguinte: Use jumpers das mesmas cores que estou utilizando para servir de referência. Por falar em jumpers, deixe o boot0 em 1 na BluePill.
E ao BluePill, basta conectar aos pinos correspondentes:
Não tem como colocar o cabo flat invertido no JTAG JLink, portanto essa conexão é tranquila.
O ambiente de compilação para o Raspberry Pi Pico tem o suporte nativo a alguns JTAGs, entre eles, o JLink. Mas invés de usar o ambiente, fiz o procedimento abaixo, testando primeiramente na BluePill. passei umas 10 horas consecutivas fazendo testes de todo o tipo antes de escrever o artigo e em dado momento tive um problema que já havia previsto: O programa atualizou o firmware, mas porque cliquei sem querer na sugestão de atualizar o firmware. Não faça isso se for usar o software da Segger. Se atualizar o firmware, já era, o dispositivo não será mais reconhecido pelo sistema e aí nada mais poderá ser feito. De preferência, não use o software da Segger. Por sorte ainda consegui obter algum resultado antes de cag…, digo, de cometer a falha de atualizar o firmware.
A versão 5.0.0g provavelmente não sugerirá atualização de firmware, então use-a, caso preferir o software da Segger.
Agora vamos fazer um arquivo de configuração chamdo .gdbinit, que deve ficar no home do usuário (/home/usuario/.gdbinit). Não esqueça que o arquivo deve conter o ponto como prefixo do nome, porque ele é um arquivo oculto.
monitor device Cortex-M3
file /tmp/arduino_build_487090/led.ino.elf
Dois parâmetros devem ser mudados; um referente à placa, que mudaremos ao usar com a Raspberry Pi Pico. Ou outro é o parâmetro file, que aponta para o arquivo elf de debug. Fiz a compilação do blink para a BluePill na IDE do Arduino e o diretório de build é esse caminho que precede o nome do arquivo (led.ino.elf). Depois de criar o arquivo apontando para uma compilação (veremos em seguida como fazê-lo na IDE do Arduino), execute esse comando em um terminal:
JLinkGDBServer -device Cortex-M3 -speed auto -if SWD
Ele deve retornar uma mensagem assim (até "Connectiong to target"):
jlink_connected,jpg
Em outro terminal digite:
Pra não ficar de mãos abanando nessa apresentação, fiz uma coisa muito simples; compilei um blink para carregar no debugger. Tem uma BluePill à mão? Não? Eis alguns motivos para ter uma:
ARM Cortex M3 – baixo custo, alto poder.
Nuttx na BluePill – Serial.
Nuttx no Maple Mini.
E em alguns dias devo apresentar mais uma razão interessante para ter essa poderosa placa de baixo custo, que você encontra na CurtoCircuito.
Aproveite para pegar uma, ela é muito mais barata que Arduino e tem bem mais poder. Para programá-la na IDE do Arduino, Abra o menu Arquivo > Preferencias e nas URLS, adicione uma vírgula se já tiver alguma URL, senão apenas adicione essa:
Depois abra o gerenciador de placas e adicione a família STM:
Selecione a placa Generic STM32F1 series e em Board Part Number selecione a BluePill. Compile o programa. No Linux o diretório de build fica em /tmp/arduino_build_xxxxxx, onde xxxxxx é o número do build, que você descobre na hora. Compile esse blink:
Não feche a IDE do Arduino senão o build será descartado. No meu caso, o diretório de build criado foi esse:
Componha a linha completa para o arquivo do sketch com extensão elf e no console do GDB digite (por exemplo):
load /tmp/arduino_build_493230/led.ino.elf
Aperte o botão de reset e veja o LED piscar. Se sair com Ctrl+C e quit, ele deve finalizar a aplicação em execução. Reconectando ele carregará novamente através do arquivo e reiniciará o processo.
Por que usar um JTAG?
(E por que usar um JTAG JLink?)
O Raspberry Pi Pico é extremamente simples de subir programa, então por qual razão utilizar um JTAG? – Resposta:
Compilamos um programa que ainda está em desenvolvimento. Agora arrastamos para o RP Pico. Deu bug; voltamos ao código, analisamos, mudamos o código para exibir algo na serial, geramos outro firmware. Agora desconectamos o RP Pico do computador, apertamos o botão BOOTSEL e conectamos ao computador. Copiamos o firmware para dentro da ára de armazenamento do Pico e: Deu outro bug! Ainda nem descobrimos a origem do primeiro. Esse ciclo vai se repetir por tantas e quantas vezes até que o programa esteja concluído?
Um JTAG é liberdade! Podemos fazer as modificações que forem no código, testar diretamente na RP Pico, fazer breakpoints pra avaliar as atribuições das variáveis, pegar a exceção de uma função, avaliar leak de memória etc. Depois de terminado, aí sim! Compilamos a versão final e podemos gravar diretamente ou através do armazenamento, sem sofrimentos!
Farei alguns vídeos de debug para mostrar na prática como usá-lo com VSCode e, sem dúvidas, não dá pra viver sem essa ferramenta! E ainda serve para uma variedade de processadores da família ARM!
Esse modelo J-Link que estou usando é da Werneck Eletronics, que você pode adquirir por um excelente preço na Shopee. Se não conhece a Shopee, vale a pena. Como não tem o achaque do MercadoLivre, os preços são melhores. A MASUGUX também adotou e acredito que seja uma tendência.
Eles tem também um outro modelo que presumo ser a mesma coisa, mas não posso confirmar. Confira nesse link.