Opciones para depurar MCU que se está congelando / estrellando (AVR32)

0

Actualmente estoy intentando averiguar por qué parece que una MCU se está estrellando / congelando. Puedo recrear el bloqueo / congelación casi todas las veces haciendo el mismo procedimiento, y he estado revisando el código exhaustivamente, tratando de encontrar cuál podría ser el problema, pero parece que no puedo encontrar al culpable.

Se está ejecutando un temporizador en la MCU con una interrupción cada 10 us. Para intentar depurarlo más, agregué un código para alternar un diodo (cada 100 ms) dentro de esta interrupción, y de repente este diodo deja de parpadear y la MCU no responde. No hay comunicación USB / UART, etc., todo parece muerto. He medido el voltaje VDD y parece estar bien, no hay fallas / caídas de voltaje.

No escribí el código, pero lo he reducido a una parte que se encarga de decodificar una señal en serie que llega a través de una interrupción de pin. Pero no más lejos.

La MCU es un AT32UC3 y tengo un depurador ATMEL-ICE, pero no tengo mucha experiencia con la depuración en una MCU en vivo.

Sospecho que podría ser una parte de la memoria que se está escribiendo y corrompiendo, pero no estoy seguro.

¿Algún consejo sobre cómo proceder con este tipo de problema?

    
pregunta Linkyyy

1 respuesta

0

Al agregar sus modificaciones a la rutina de interrupción, parece que ha expuesto una condición de carrera en el código original o ha creado una nueva condición de carrera.

Escribir el código de reingreso puede ser complicado, escribir el código de interrupción de reingreso es aún más complicado. Escribir rutinas de interrupción interrumpibles está plagado de peligros.

Es muy probable que la rápida interrupción estuviera destinada a ser rápida, hacer su trabajo y salir del camino tan pronto como sea posible, dejando tiempo para que sucedan otras cosas. También es probable que sea de alta prioridad la interrupción de todo lo que se interponga en su camino y es probable que consuma > 5% de todas las instrucciones ejecutadas; al cambiar este código, aumentará ese recurso compartido.

También indica que las comunicaciones son impulsadas por interrupciones, lo que sugiere otra decisión de tiempo crítico. Es probable que algunas partes de este código no perdonen los retrasos en su ejecución. Su modificación añadió la posibilidad de retrasos adicionales.

Al modificar el código y aumentar el tiempo que tarda en completarse la rápida interrupción. Surgió una o más de estas condiciones:

  • El tiempo para ejecutar la rutina de interrupción de comunicaciones aumentó hasta el punto en que su lógica no pudo ejecutarse correctamente.
  • La rutina de interrupción de comunicaciones no pudo finalizar antes de que se interrumpiera, creando un problema de reentrada o simplemente desbordando la pila.
  • Está modificando un registro o indicador en la rutina de interrupción rápida que no se restaura correctamente, lo que causa problemas en las interrupciones de las comunicaciones.

Para hacer cosas lentas, como parpadear un LED, realmente no es una buena idea aumentar el tiempo de ejecución de algo que se supone que es rápido.

    
respondido por el Edgar Brown

Lea otras preguntas en las etiquetas