Teach Remote lab lessons

Teach lesson

STM32 Mbed CodeIDE (4/8): depuração serial com printf

Os estudantes usam printf para depuração serial no STM32 Mbed CodeIDE, comparam o comportamento esperado com o real e corrigem uma inconsistência com base em evidências.

  • STM32 Nucleo (Mbed)
  • 55 min
  • Ensino médio / formação técnica introdutória em eletrônica
  • Português (Brasil)
  • Embedded systems
STM32 Nucleo (Mbed)
STM32 Nucleo (Mbed)

Learning Outcomes

  • Use printf() para observar o que um programa Mbed em execução está fazendo.

  • Imprimir valores inteiros em vez de depender da formatação de ponto flutuante.

  • Use a saída serial para depurar uma alteração controlada por vez.

Student activity preview

Activity Content

Preview only. In a class session, students can fill in responses and submit their work to the teacher.

1

Por que a saída serial é importante

8 min

Os LEDs não informam quais valores o código usava quando algo deu errado. Um controlador costuma precisar de um painel para quem programa, e o console serial oferece esse painel: assim você pode localizar uma inconsistência de temporização ou lógica sem depender apenas da câmera.

Quando um controlador não se comporta conforme o esperado, a adivinhação é lenta. A saída Serial permite imprimir valores e pontos de verificação:

printf("cycle=%d led=%d\n", cycle, led_state);

Nestes programas Mbed, printf() envia texto da placa STM32 em execução para o console serial em CodeIDE. Os marcadores %d são substituídos por valores inteiros e \n inicia uma nova linha para que cada leitura seja mais fácil de copiar.

Este curso usa saída serial inteira. Neste ambiente Mbed, a saída printf("%f") de ponto flutuante não é uma boa primeira ferramenta de depuração. Use números inteiros como milissegundos, milivolts, porcentagens e graus.

No laboratório STM32 Mbed CodeIDE, a saída serial aparece no painel Console, próximo à parte inferior da tela. O CodeIDE gerencia a conexão serial USB e a taxa de transmissão; basta compilar, fazer upload e ler as linhas impressas.

Como printf chega ao console CodeIDE

Caminho de printf em main.cpp até Compile e Upload, o STM32 em execução e o CodeIDE Console mostrando campos de ciclo e intervalo.

Após o upload, leia a área Console próxima à parte inferior de CodeIDE. Aquilo é
onde aparecem as linhas impressas pelas chamadas printf() em execução.

Qual verificação testa melhor se um valor de tempo impresso descreve o programa físico?

2

Imprimir uma pulsação em execução

26 min

Planeje duas compilações e cerca de 22 minutos de laboratório ativo: uma execução obrigatória com a falha e uma execução corrigida. Se estiver na fila, prepare a tabela e o método de cronometragem de cinco intervalos. Não altere o código-fonte antes de obter as evidências seriais e da câmera para a compilação 1.

  1. Abra o laboratório STM32 Mbed CodeIDE.

  2. Abra main.cpp.

  3. Substitua o arquivo exatamente pelo programa abaixo. Esta versão fornecida contém uma falha deliberada de temporização/relatório; não corrija ainda.

  4. Salve, compile a compilação 1 e carregue a versão com bugs.

  5. Abra ou observe a área do console serial em CodeIDE.

  6. Observe as linhas seriais e confirme se o número do ciclo aumenta enquanto LED muda.

  7. Copie pelo menos três linhas seriais antes de alterar o programa.

  8. Com a câmera, cronometre cinco intervalos consecutivos de mudança de estado LED em segundos. Divida por 5 para um intervalo observado.

  9. Mantenha a compilação 1 em execução até concluir a tabela e a evidência de tempo.

#include "mbed.h"

DigitalOut status_led(PB_5, 0);

int main() {
    int cycle = 0;
    const int interval_ms = 500;
    const auto interval = 1000ms;

    printf("STM32 Mbed serial debug start\n");

    while (true) {
        status_led = !status_led.read();
        cycle = cycle + 1;

        printf("cycle=%d led=%d interval_ms=%d\n", cycle, status_led.read(), interval_ms);

        ThisThread::sleep_for(interval);
    }
}

As primeiras linhas devem ser semelhantes a esta:

STM32 Mbed serial debug start
cycle=1 led=1 interval_ms=500
cycle=2 led=0 interval_ms=500
cycle=3 led=1 interval_ms=500

Preencha três linhas da tabela com linhas cycle=... diferentes, não com a linha de inicialização. Cole cada linha completa. Em Comportamento da câmera nessa linha, registre o estado ou a mudança do LED visível aproximadamente no mesmo momento; não suponha que 0/1 sempre signifique ligado/desligado. Escreva uma observação curta, como "o ciclo aumentou em 1" ou "o valor impresso do LED alternou". Avalie a temporização apenas pela comparação de cinco intervalos abaixo.

Tabela de evidências seriais

Linha copiada do Console Comportamento da câmera nessa linha O que isso me diz

Para a compilação 1 com a falha, responda com estas três linhas:

1. Intervalo impresso: ... ms
2. Tempo medido para 5 intervalos: ... s
3. Cálculo de um intervalo: (... s / 5) × 1000 = ... ms

Não proponha uma correção ainda.

3

Encontre uma incompatibilidade serial

13 min

Use apenas a linha serial, a temporização da câmera e as duas constantes no código para diagnosticar a compilação 1.

Cole uma linha serial enganosa da compilação 1. Indique o intervalo informado e o intervalo medido pela câmera, ambos com unidades, e identifique as duas expressões do código que discordam. Não inclua ainda as evidências corrigidas.

Após responder, substitua as duas declarações de tempo por este modelo de correção. Ele contém exatamente dois espaços reservados para bloqueio de compilação. Escolha um intervalo de 500 ms ou 1000 ms, mas ambas as substituições de TODO devem representar a mesma duração. Procure TODO antes de compilar.

// 1: número inteiro milissegundos impressos na linha serial.
const int interval_ms = TODO_REPORTED_MS;
// 2: a mesma duração de um literal Mbed chrono, incluindo ms.
const auto interval = TODO_WAIT_MS;

Salve, compile a compilação 2, carregue e repita a mesma medição da câmera em cinco intervalos. Somente após registrar as evidências corrigidas, clique em Marcar prática como concluída.

Para a compilação 2 corrigida, responda neste formato:

1. Linha serial: ...
2. Intervalo impresso: ... ms
3. Tempo medido para 5 intervalos: ... s
4. Cálculo de um intervalo: (... s / 5) × 1000 = ... ms
5. Conclusão: os valores concordam/não concordam dentro da incerteza de cronometragem da câmera porque...

4

Envie seu código

8 min

Anexe seu main.cpp final salvo

Clique em Verificar arquivos salvos, confirme se main.cpp contém a versão corrigida e carregada e nenhum TODO. Depois anexe e envie.