Arduino no Atmel Studio 7 – Parte 4

O que precisa e funcionalidades do Atmel Studio para debugar código do Arduino.

Tópicos

  1. Introdução,
  2. ATMega328PU x Arduino UNO,
  3. Programa exemplo,
  4. Debug – Principais funcionalidades,
  5. Finalizando.

Se você curtir esse artigo, não esqueça de dar uns cliques nos anúncios para ver o que os anunciantes tem para te oferecer. Vou ficar muito contente.

1- Introdução:

Debug: O Atmel Studio 7, derivado do Visual Studio e desenvolvido pela Atmel é a ferramenta de desenvolvimento criada pelo fabricante dos microprocessadores ATMEL, inclusive do chip ATMega328PU utilizado no Arduino Uno deste tutorial.

A plataforma do Arduino, embora fácil de se utilizar, carece de uma série de recursos quando comparada com o Atmel Studio. Sem ficar polindo muito, na parte de debug, o Atmel Studio dispõe de funções avançadas de depuração de código como o monitoramento do processador e seus registradores internos, sem contar que um programador pode escolher entre depurar código utilizando a função ‘on chip debug’ ou simulando precisamente a arquitetura AVR e seus dispositivos incluindo todas as instruções, interrupções e a maioria dos módulos de entrada e saída do chip. Ainda sobre o simulador, ele opera em conjunto com os projetos desenvolvidos no Atmel Studio 7, como se fosse um chip. Isso permite que o programador empregue os comandos de depuração de código normais como ‘Run’, ‘Break’, ‘Reset’, ‘Single Step’, configure ‘breakpoints’ e monitore variáveis. As janelas de entrada e saída (I/O), memória e registradores são completamente funcionais quando se usando o simulador (fonte ->nesse link aqui<-).

Só essas funcionalidades favorecem em muito a produtividade na depuração de código. Além disso o Atmel Studio também incorpora a visão: ‘Program Counter Trace’. Essa visão em particular permite que um analista de qualidade de software identifique exatamente quais partes do código foram ou não foram depuradas, inclusive podendo emitir um relatório indicador do índice de cobertura de testes.

O que será apresentado: Usando como pano de fundo um pequeno programa que será depurado utilizando o simulador de CPU, será mostrado como se entra em depuração, as principais janelas e funcionalidades de depuração de código bem como serão destacados alguns pontos a se levar em conta quando depurando código em geral. Não se trata de um artigo introdutório e devo lembrar que o passo a passo de como depurar um programa já foi coberto milhares de vezes em outros tutoriais. Ao contrário de perder tempo repetindo isso, vou abordar o que achei interessante na plataforma Atmel Studio em relação a depuração de código.

Tópico a ser abordado no futuro: A depuração de código utilizando ferramentas como‘Atmel-ICE‘, ‘AVR Dragon™‘, ‘AVR ONE!‘ não serão abordadas nesse tutorial. Caso você tenha interesse específico em fazer um tutorial sobre essas ferramentas, fique à vontade para entrar em contato comigo no horário comercial.

Agradecimentos: Atendendo a pedidos: Caro leitor e antes de ir a fundo na bagaça, segue com todo o respeito o cumprimento pros mano: Aqui é nois na fita mermão. Saiba que o bagulho é lento e a parada é loca. Sua presença só engrandece o movimento. Dá um salve se tiver algo errado na fita. É nóis. Falô.

2- ATMega328PU x Arduino UNO:

Quando depurando código, a primeira coisa que precisa  é informação.

2.1- Esconderam o processador:

Quem já está habituado com a plataforma Arduino, sabe que os comandos de programação muitas vezes se referem aos conectores da placa Arduino e não às portas e pinos do processador Atmel (nem vou falar que esconderam o ‘main’ do Arduino nos quintusdusinferno).

Na verdade, muitas vezes a implementação das bibliotecas dos shields ‘esconde’ o processador Atmel.

Isso pode ser facilmente constatado ao analisarmos a implementação de uma biblioteca qualquer, como a LiquidCrystal. Conforme exemplo abaixo os atributos de inicialização da classe se referem aos números dos conectores da placa Arduino e não aos números da porta do processador Atmel.

LiquidCrystal lcd( pino_rs, pino_enable, d0, d1, d2, d3);

2.2- Encontrando o processador:

Como o depurador de código do Atmel Studio 7 é voltado para o microprocessador Atmel, todas as mensagens do depurador de código são referentes à nomenclatura adotada pela Atmel. Se você não leu o manual do processador ATMEL ainda, tá perdendo tempo. Clique ->nesse link aqui<- para ler o manual inteiro. São apenas 660 páginas de informação verdadeira, confiável e gratuita.

Para poder debugar o código que usa as bibliotecas do Arduino é necessário saber relacionar as mensagens do depurador de código com os conectores da placa Arduino, ou seja, tem que fazer a correspondência entre a pinagem do processador Atmel com os pinos da placa Arduino.

Exemplo 1: Digamos que o depurador de código do Atmel Studio indique que o Port B ‘PB4’ está com nível lógico alto. Consultando as figuras abaixo, dá para identificar que o Port B ‘PB4’ corresponde ao pino 12 do conector da placa do Arduino. Logo o pino 12 do conector da placa do Arduino está com nível alto.

Exemplo 2: Digamos que seja necessário forçar o nível lógico zero no pino 15 do conector do Arduino. Consultando as figuras abaixo dá para identificar que é possível forçar o nível lógico zero no pino 15 do Arduino, forçando o nível lógico zero no Port C ‘PC1’ e assim por diante.

Figuras 1, 2 e 3 relacionam o diagrama esquemático da placa do Arduino Uno com a pinagem do chip ATMega328PU

Figura 1: Pinagem do ATMega328PU junto com a placa Arduino UNO. Fonte: www.pighixxx.com. Clique para ampliar

Abaixo segue o detalhe da pinagem do ATMega328PU

Figura 2: Detalhe da pinagem do ATMega328PU no Arduino. Fonte: www.pighixxx.com. Clique para ampliar.

Diagrama esquemático o Arduino Uno, versão para impressão.

Figura 3: Diagrama esquemático do Arduino Uno.

3- Programa exemplo:

Segue abaixo um pequeno código para ilustrar algumas funcionalidades que a plataforma Atmel Studio oferece.

A primeira parte do código liga e em seguida desliga o pino 13 da placa do Arduino. Essa parte usa funções da plataforma Arduino. Embora inicialmente a operação seja mais simples, a implementação do código fica escondida dentro da função ‘pinMode’.

A segunda parte seta alguns bits no ‘PORTC’, no registrador ‘DDRC’, faz atribuição de ponteiro e também faz a leitura do ‘PORTC’ para uma posição de memória.

#include <Arduino.h>
#include <avr/cpufunc.h>
unsigned char i;
unsigned char * ponteiro;
void setup() {
//***** Código do ARDUINO, usando funções do Arduino.
	 //Pino 13 como saída
	 pinMode(13, OUTPUT);
	 //Escrevendo nível lógico 1 no pino 13 do conector da placa
	 digitalWrite(13,HIGH);
	 //Escrevendo nível lógico 0 no pino 13 do conector da placa
	 digitalWrite(13,LOW);
//***** Fim do código do ARDUINO, usando funções do Arduino.
// Código ATMEL, manipulando direto os registradores do mircroprocessador
	//Colocando os bits 0, 1, 4 e 5 do PORTC no nível lógico 1
	PORTC = (1<<PC5)|(1<<PC4)|(1<<PC1)|(1<<PC0);
	//Colocando os bits 0, 1, 2, 3 e 4 do registrador DDRC no nível lógico 1
	DDRC = (1<<DDC4)|(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
	// Colocando um 'no-operation' para dar um tempo para a CPU respirar*/
	_NOP();
	// Lendo o endereço da variável i para eu a localizar depois
	ponteiro = &i;
	// Pegando o conteúdo do registro PINC e jogando na variável i
	i = PINC;
	// Colocando um 'no-operation' para dar um tempo para a CPU respirar*/
	_NOP();
}

O objetivo dessas duas rotinas não é compará-las, mas apenas ajudar a mostrar as funcionalidades que a plataforma Atmel Studio oferece.

4- Debug – Principais funcionalidades:

O site da Atmel tem uma parte dedicada a informações sobre depuração de código. Caso queira consultar, tem o manual do Atmel Studio ->nesse link aqui<-.

4.1- Habilitando o simulador de processador e entrando em Debug:

Para habilitar o simulador, conforme figura 4 abaixo, basta clicar no seletor de ferramenta(1) -> vai abrir a janela de configuração do Debug(2) -> assegure que o tópico ‘Tool'(3) esteja selecionado -> escolha no dropdown list a opção ‘Simulador'(4). As demais opções podem ser deixadas como estão. Feche a tela de configuração do Debug e volte para o programa. Para iniciar o debug utilizando o simulador, clique no botão ‘Start Debugging and Break’ (5). Note que a operação do Atmel Studio é semelhante à operação da plataforma Visual Studio, da Microsoft.

Figura 4: Habilitando o simulador e iniciando a depuração de código.

4.2- Principais opções para depuração de código:

Conforme indicado na figura 6 abaixo, os controles para depuração de código ficam na barra de acesso rápido (1) e nas opções do menu ‘Debug'(2). A barra de acesso às variáveis do processador(3) talvez seja um dos recursos mais importantes dessa plataforma. Com ela é possível:

    • Abrir a janela de I/0 (4),
    • Consultar o estado do processador(5),
    • Abrir o conteúdo da memória do processador(6),
    • Abrir a janela de consulta dos registradores do processador(7)
    • Fazer a engenharia reversa no código compilado, permitindo a depuração do código assembler conforme indicado na figura 7.
Figura 6: Principais funcionalidades do depurador de código da plataforma Atmel Studio.

Abaixo, na figura 7, segue a tela em modo de disassembler, mostrando o microcódigo do processador.

Figura 7: Plataforma Atmel Studio no modo Disassembler.

4.3- Program counter trace view:

Tem outro tópico importante que é  janela ‘Program Counter Trace’ que mapeia o comportamento do registro ‘program counter’. Esse mapeamento permite levantar estatísticas e identificar informações como saber exatamente quais linhas de código foram e não foram percorridas conforme indicado na figura 8 abaixo:

Figura 8: Program counter traceview

Isso é importante para depuração de código, testes e para garantir a qualidade da aplicação desenvolvida. O detalhamento completo dessa funcionalidade está no manual do Atmel Studio ->nesse link aqui<-.

5- Finalizando:

Pessoal, nessa série acredito ter coberto boa parte da plataforma de desenvolvimento do Atmel Studio, apresentando as principais funcionalidades. Em particular esse artigo mostrou os principais pontos que a plataforma oferece para depuração de código. Trata-se de uma plataforma para desenvolvimento profissional de código com suporte a todas as funcionalidades do processador, inclusive as de gerenciamento de energia, em contraste com a plataforma do Arduino que oculta o acesso ao main. Essa série junta a proposta do Arduino, uma plataforma de hardware de código aberto com a plataforma de desenvolvimento da Atmel, ficando ao critério do desenvolvedor empregar uma, outra ou ambas soluções, lembrando que nem falamos das ferramentas ‘Atmel-ICE‘, ‘AVR Dragon™‘, ‘AVR ONE!‘, recursos adicionais para programação dos chips da Atmel. Não se esqueça de ler a documentação do processador ATMega328PU  e a do do Atmel Studio.

Um abraço.

By Renato de Pierri.

25 de Janeiro de 2017.

Last updated by at .

Deixe um comentário