2 de dezembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Debug com Raspberry Pi

Debug com Raspberry Pi | Como aprender a programar em Python

Deixando claro, faremos debug com Raspberry Pi 400, mas o alvo é a Raspberry Pi Pico. Sabe o que é “debug” ou, “depuração” de código?

O que é debug?

Debug (ou depuração) é quando fazemos uma análise em busca da razão de um problema (ou bug) na execução do programa.

Quando programamos nativamente para uma arquitetura, a própria IDE oferece os recursos de depuração da linguagem. Em C/C++ usamos o GDB, seja através de uma IDE integrada ou à parte, por linha de comando. Na IDE que programamos podemos adicionar pontos de parada no código, afim de verificar a atribuição de valores a uma variável, a chamada de um recurso, a recepção de um valor através de qualquer protocolo de comunicação (local ou remota) etc. Mas como fazer paradas em programas que são gerados no desktop e enviados para uma MCU? Pode parecer impossível, mas não é. Para isso, usamos um JTAG. Já escrevi sobre alguns JTAGs, como nesse artigo do Laboratório Maker. Usei ele para fazer testes em uma Bluepill, que é um ARM Cortex-M3. Também apresentei o ESP-Prog, para fazer depuração em ESP32. Escrevi dois artigos, sendo esse o segundo. Tem vídeo no canal também, dê uma conferida e se apaixone. E se inscreva.

SWD na Raspberry Pi Pico

Já a Raspberry Pi Pico é um ARM M0, do qual você encontrará muitas referências aqui no blog. Ela possui uma interface de depuração cujo acrônimo é SWD – Serial Wire Debug. Através dessa interface, podemos usar um JTAG que suporte SWD e tal como exemplificado no vídeo da ESP-PROG, podemos fazer a MCU parar em uma determinada instrução! Fazer debug na plataforma nativa já é bem legal, mas fazer debug em uma plataforma remota é fenomenal! Mas calma, abordaremos amplamente o tema, para deleite do kibadores que têm frequentemente copiado chamadas e “maquiado” conteúdos do blog sem citar a fonte. Torçamos para que um dia suas habilidade com embarcados seja ao menos tanto quanto eles enganam em seus vídeos. Sigamos.

Wiring da Raspberry Pi 400 com a Raspberry Pi Pico

Qualquer Raspberry com 40 pinos terá exatamente o mesmo pinout, portanto, o mesmo wiring.

Temos 2 wirings importantes; a comunicação serial e a interface de depuração.

Serial da Raspberry Pi 400 com a Raspberry Pi Pico

A documentação oficial descreve claramente a comunicação. Está em inglês, mas acho que mesmo sem saber inglês dá pra entender. Mas não importa se sabe ou não inglês, porque aqui disponho o processo de maneira clara e em português.

A primeira coisa a fazer em sua Raspberry (2, 3, 4 ou 400) é habilitar a interface serial no GPIO. Para isso, abra um terminal (a janelinha preta da barra de tarefas) e digite:

sudo raspi-confg

No menu que se abrirá, vá até Interfacing Options -> Serial. Em dado momento será perguntado se o login do shell deve estar acessível via serial. Responda “Não”. Quando for perguntado se a porta de hardware serial deve ser habilitada, responda “Sim”.

Depois selecione “Finish” e confirme a reinicialização do sistema. Todo o processo está disposto nas imagens a seguir:

Depois sim, podemos então fazer o wiring:

Raspberry Pi (2, 3, 4 ou 400)Raspberry Pi Pico
GND – Pino 14GND – Pino 3
GPIO15 – UART_RX0 – Pino 10GP0 – UART0_TX – Pino 1
GPIO14 – UART_TX0 – Pino 8GP1 – UART0_RX – Pino 2

E um Ctrl+Chups em grande estilo, diretamente da página 16 da documentação oficial:

Debug com Raspberry Pi

Sem hipérbole, no Linux temos um número desconhecido de opções para fazer comunicação serial. Muitas opções “mesmo”. A documentação oficial exemplifica o uso do minicom, mas se não está confortável ainda com a linha de comando do Linux, sugiro a utilização do CuteCom, que pode ser instalado via apt-get:

sudo apt-get install cutecom

“Será que vai funcionar igual minicom?” – Respondo:

Debug com Raspberry Pi

Poderia ser também o GTKTerm ou Putty, mas o CuteCom tem uma interface mais limpa para quem está começando. Algumas outras opções (mas agora de linha de comando) são o screen, tio, picocom e cu.

Se quiser experimentar o minicom, leia a documentação e leia também a parte para sair do terminal. Quem usa vi sabe a quê me refiro.

Exemplo de uso dos programas seriais não gráficos

Debug com Raspberry Pi: Vamos começar pelo pseudo-indecente.

cu

Sua sintaxe:

cu -l /dev/serial0 -s 19200

screen

Sua sintaxe:

screen /dev/serial0 19200,cs8

minicom

Sua sintaxe:

minicom -b 115200 -o -D /dev/serial0

tio

Sua sintaxe:

tio -b 19200 /dev/serial0

picocom

O primeiro se chama cu, mas pelo menos esse se chama picO. Sua sintaxe:

picocom --baud 19200 /dev/serial0

Conexão serial com shell script

E pra fechar esse tópico em grande estilo, um script shell que faz o trabalho de forma semelhante aos programas compilados:

#!/bin/sh

# connect.sh

# Usage:
# $ connect.sh <device> <port speed>
# Example: connect.sh /dev/ttyS0 9600

# Set up device
stty -F $1 $2

# Let cat read the device $1 in the background
cat $1 &

# Capture PID of background process so it is possible to terminate it when done
bgPid=$!

# Read commands from user, send them to device $1
while read cmd
do
   echo "$cmd" 
done > $1

# Terminate background read process
kill $bgPid

Alimentação da RPi Pico

Dá pra alimentar a Raspberry Pi Pico diretamente pela Raspberry Pi, mas envolve um trabalho extra e algum risco. Nesse caso, alimente pela USB do Raspberry Pi mesmo, sem problemas.

Usando SWD

Daqui em diante deixarei para o próximo artigo, porque esse já está demasiadamente extenso. “. Faremos um debug com Raspberry Pi de fato, não apenas lendo mensagens na serial. Não perca!

Como necessariamente mostrarei em vídeo e darei exemplos, sugiro que se inscreva no canal DobitaobyteBrasil no Youtube. Até mais!