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.
New to LabsLand? Create your teacher account
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.
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
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?
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.
Abra o laboratório STM32 Mbed CodeIDE.
Abra
main.cpp.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.
Salve, compile a compilação 1 e carregue a versão com bugs.
Abra ou observe a área do console serial em CodeIDE.
Observe as linhas seriais e confirme se o número do ciclo aumenta enquanto LED muda.
Copie pelo menos três linhas seriais antes de alterar o programa.
Com a câmera, cronometre cinco intervalos consecutivos de mudança de estado LED em segundos. Divida por 5 para um intervalo observado.
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.
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...
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.