Como usar pontos de interrupção para depuração

9

Os pontos de interrupção são uma ótima maneira de ver como o compilador é executado no seu código. Agora, minha pergunta é: existe a possibilidade de usar pontos de interrupção ao depurar seu código?

H. Pauwelyn
fonte

Respostas:

9

Conforme observado na resposta de Majenko, o Arduino IDE não fornece um mecanismo de ponto de interrupção, mas o Atmel Studio oferece suporte a pontos de interrupção . [*]

No entanto, se você tiver um comutador e um LED, poderá acompanhar o progresso do seu programa de maneira a fornecer alguns dos benefícios dos pontos de interrupção. Você adicionaria uma subrotina, digamos BPReport(), que através da saída serial ou de um LCD relate valores de variáveis ​​críticas, acenda o LED e aguarde até que o interruptor seja pressionado e liberado, com rejeição. Ligue para sua BPReport()rotina sempre que quiser um ponto de interrupção incondicional. Para pontos de interrupção condicionais, você pode ter uma rotina BPReportIf(cond)que chame BPReport()se condfor verdadeira. Se você não deseja enviar via serial, use vários LEDs ou um LCD e use vários comutadores se desejar controles de interrupção externos (por exemplo, condpode ser um teste de um dos comutadores extras).

[*] Alguns depuradores de hardware modificam o código baixado sempre que os pontos de interrupção são adicionados, alterados ou removidos. Esse uso consumirá a memória flash mais rapidamente do que apenas o download ocasional. Se um chip tiver sido muito usado para essa depuração, não use esse chip em um sistema de produção.

James Waldby - jwpat7
fonte
4

Embora Majenko, sua resposta esteja correta, existem outras opções.

Quanto à depuração real do hardware, conforme declarado por majenko, eu diria:

  1. Instale e use um IDE real, como o Atmel Studio ou o plug-in do eclipse do arduino chamado sloeber (sou autor) e
  2. Use um depurador de hardware completo ou um hardware que o integre como o Arduio zero ou outro hardware usando outra tecnologia de depuração como o ESP8266 que permite a depuração USB

Uma outra opção de depuração de uma categoria completamente diferente é organizar seu código para que a lógica de decisão (independente do hardware) e a ação (dependente do hardware) sejam completamente separadas.

Em seguida, compile seu esboço como um programa local e depure a "lógica de decisão" em sua máquina local. Este método não permite "depuração de hardware". Este método também permite testes de unidade.

Observe que sua máquina local provavelmente é de 32 ou 64 bits e a maioria dos Arduino são 8 bitters, o que resultará em diferenças nos tipos de dados, o que é um ponto de atenção extra ao usar esse método.

jantje
fonte
4

A biblioteca Arduino-Debug fornece um depurador simples no destino para esboços do Arduino. O comando Debug é adicionado diretamente ao esboço. Um shell de comando do depurador é iniciado em pontos de interrupção e asserções.

insira a descrição da imagem aqui

A captura de tela acima mostra o exemplo de esboço executado em um monitor de saída Arduino Mega com Serial usado pelo aplicativo e Serial1 usado no shell do depurador.

Comandos de depuração de esboço

  • ASSERT (cond) Verifique a condição de afirmação. Se falso, o shell de depuração é chamado. O esboço não pode continuar.
  • BREAKPOINT () O shell de depuração é chamado.
  • BREAK_IF (cond) O shell de depuração é chamado se a condição for verdadeira.
  • CHECK_STACK (sala) Verifique se há espaço (bytes) na pilha. Se falso, o shell de depuração é chamado.
  • DEBUG_STREAM (dev) Use o dispositivo de fluxo fornecido para a sessão de depuração. Tipicamente serial.
  • OBSERVE (expr) Imprime a expressão no fluxo de depuração.
  • OBSERVE_IF (cond, expr) Imprima a expressão no fluxo de depuração se a condição for verdadeira.
  • REGISTRAR (var) Registre uma variável para acessar a partir do shell de depuração. Comandos de shell de depuração

Comandos de shell de depuração

  • ? VARIABLE Imprime endereço e valor variáveis.
  • @VARIABLE Imprime o endereço variável do ponteiro e o valor de referência.
  • backtrace Imprima uma pilha de chamadas simples.
  • comandos Imprima a lista de comandos (consulte também a ajuda).
  • data Imprime o conteúdo da área de dados, ou seja, variáveis ​​globais.
  • Deixe o shell de depuração e continue a execução do sketch.
  • pilha Imprime o conteúdo da pilha, ou seja, dados alocados dinâmicos.
  • help Imprima a lista de comandos.
  • memória Imprima o status da memória.
  • saia Pare o esboço.
  • pilha Imprime o conteúdo da pilha, ou seja, quadros de chamada, argumentos, endereços de retorno.
  • variáveis Imprime a lista de variáveis ​​registradas.
  • onde Imprima o arquivo de código-fonte e a linha em que o shell de depuração foi chamado.

Todos os comandos do debug shell podem ser abreviados para comandos de caracteres únicos. Por favor, consulte o README para mais detalhes; detalhes da instalação, exemplo de esboço e benchmarking.

Mikael Patel
fonte
11
A biblioteca doada pelo Mikael permite definir pontos de interrupção condicionais, imprimir valores das variáveis, status da memória, rastreamentos de chamadas e examinar e alterar variáveis ​​em um ponto de interrupção. Pro: não precisa de hardware ($$), não bate tão forte no Flash (como definir e remover pontos de interrupção com um depurador de hardware). ....
JRobert
11
.... Con: Maior impacto no espaço de código do programa, em algum espaço de RAM e possivelmente no tempo de execução, se examinar o código crítico de tempo; alguma curva de aprendizado para compilar (e depois remover) as chamadas da biblioteca; a necessidade de antecipar locais de ponto de interrupção ou recompilá-los quando você descobrir onde precisa deles. Os contras não são uma crítica ao trabalho de Mikael; eles vêm com essa técnica.
JRobert #
11
@JRobert Bom resumo do Pro-Con! Tentei abordar alguns dos contras, permitindo que o depurador fosse adaptado. Há um conjunto de definições que permitirá que aplicativos sensíveis à pegada reduzam ao mínimo o shell de depuração. Como qualquer depurador para sistemas embarcados, é difícil depurar código crítico (contínuo) de tempo com pontos de interrupção. A única alternativa são os pontos de observação. Isso pode ser otimizado usando um buffer de rastreamento e remova a saída serial no código crítico de tempo.
Mikael Patel
3

Não no IDE do Arduino.

Você precisa:

  1. Instale e use um IDE real, como o Atmel Studio e
  2. Use um depurador de hardware completo

Não há previsão para depuração através da interface UART / USB usando o carregador de inicialização.

Majenko
fonte