Lección Teach
STM32 Mbed CodeIDE (4/8): depuración serie con printf
El alumnado usa depuración serie con printf en STM32 Mbed CodeIDE para comparar comportamiento esperado y real, y corregir una discrepancia con evidencia.
¿Primera vez en LabsLand? Crea tu cuenta de docente
Resultados de aprendizaje
Usar
printf()para observar qué está haciendo un programa Mbed en ejecución.Imprimir valores enteros en vez de depender de formato de punto flotante.
Usar salida serie para depurar un cambio controlado cada vez.
Vista previa de la actividad del estudiante
Contenido de la actividad
Solo vista previa. En una sesión de clase, los estudiantes pueden completar respuestas y entregar su trabajo al docente.
Por qué importa la salida serie
8 min
Los LED no pueden decirte qué valores estaba usando el código cuando algo falló. Un controlador suele necesitar un panel de instrumentos para quien programa, y la consola serie proporciona ese panel para encontrar un desajuste de temporización o lógica en vez de adivinar solo a partir de la cámara.
Cuando un controlador no se comporta como esperas, adivinar es lento. La salida serie permite imprimir valores y puntos de control:
printf("cycle=%d led=%d\n", cycle, led_state);
En estos programas Mbed, printf() envía texto desde la placa STM32 en ejecución a la consola serie de CodeIDE. Los marcadores %d se reemplazan por valores enteros, y \n empieza una línea nueva para que cada lectura sea más fácil de copiar.
Este curso usa salida serie con enteros. En este entorno Mbed, la salida printf("%f") de punto flotante no es una buena primera herramienta de depuración. Usa enteros como milisegundos, milivoltios, porcentajes y grados.
En el laboratorio STM32 Mbed CodeIDE, la salida serie aparece en el panel de consola cerca de la parte inferior de la vista del laboratorio. CodeIDE gestiona por ti la conexión USB serie y la velocidad en baudios; solo compila, carga y lee las líneas impresas.
Cómo llega printf a la consola de CodeIDE
Después de cargar, lee la zona Console cerca de la parte inferior de CodeIDE.
Ahí aparecen las líneas de los printf() que está ejecutando la placa.
¿Qué comprobación verifica mejor si un valor temporal impreso describe el programa físico?
Imprimir un latido en ejecución
26 min
Planifica dos compilaciones y unos 22 minutos de laboratorio activo: una ejecución errónea obligatoria y una ejecución corregida. Si hay cola, prepara la tabla y un método para cronometrar cinco intervalos. No cambies el código para diagnosticar antes de obtener evidencia serie y de cámara de la versión 1.
Abre el laboratorio STM32 Mbed CodeIDE.
Abre
main.cpp.Reemplaza el archivo exactamente con el programa siguiente. Esta versión contiene un fallo deliberado entre temporización e informe; no lo corrijas todavía.
Guarda, compila la versión errónea 1 y carga.
Abre u observa la zona de consola serie en CodeIDE.
Observa las líneas serie y confirma que el número de ciclo aumenta mientras el LED cambia.
Copia al menos tres líneas serie antes de cambiar el programa.
Con la cámara, cronometra cinco intervalos consecutivos de cambio de estado en segundos. Divide entre 5 para obtener un intervalo observado.
Mantén la versión 1 hasta completar la tabla y la evidencia temporal.
#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);
}
}
Las primeras líneas deberían parecerse a estas:
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
Rellena tres filas con líneas cycle=... distintas, no la inicial. Pega cada línea completa. En Comportamiento en cámara en ese momento, registra el estado o cambio visible aproximadamente a la vez; no supongas que un 0/1 bruto significa siempre encendido/apagado. Escribe una observación breve como "cycle aumentó en 1" o "el valor led alternó". Evalúa la temporización solo con la comparación de cinco intervalos siguiente.
Tabla de evidencia serie
| Línea de consola copiada | Comportamiento en cámara en ese momento | Qué me indica |
|---|---|---|
Para la versión errónea 1, responde con estas tres líneas:
1. Intervalo impreso: ... ms
2. Tiempo medido para 5 intervalos: ... s
3. Cálculo de un intervalo: (... s / 5) × 1000 = ... ms
Todavía no propongas una corrección.
Encontrar una discrepancia serie
13 min
Usa solo la línea serie, tu medida de cámara y las dos constantes temporales del código para diagnosticar la versión 1.
Pega una línea serie engañosa de la versión 1. Indica el intervalo afirmado y el intervalo medido por cámara, ambos con unidades, e identifica qué dos expresiones del código discrepan. No incluyas aquí la evidencia corregida.
Después de responder, sustituye las dos declaraciones temporales por esta plantilla de corrección. Contiene exactamente dos marcadores que impiden compilar. Elige un intervalo de 500 ms o 1000 ms, pero ambos TODO deben representar la misma duración. Busca TODO antes de compilar.
// 1: milisegundos enteros impresos en la línea serie.
const int interval_ms = TODO_REPORTED_MS;
// 2: la misma duración como literal chrono de Mbed, incluido ms.
const auto interval = TODO_WAIT_MS;
Guarda, compila la versión 2, carga y repite la misma medida de cinco intervalos. Solo después de registrar la evidencia corregida, pulsa Marcar práctica como completada.
Para la versión corregida 2, responde con este formato:
1. Línea serie: ...
2. Intervalo impreso: ... ms
3. Tiempo medido para 5 intervalos: ... s
4. Cálculo de un intervalo: (... s / 5) × 1000 = ... ms
5. Conclusión: coinciden/no coinciden dentro de la incertidumbre de cámara porque...
Enviar tu código
8 min
Adjunta tu main.cpp final guardado
Pulsa Comprobar archivos guardados, confirma que main.cpp contiene la versión corregida y cargada y que no queda ningún TODO. Después adjunta y envía.