Comportamiento del microcontrolador AVR que solo contiene el gestor de arranque

Estoy trabajando en una implementación de AVR109, donde el cargador de arranque se agota después de dos segundos si una serie determinada de bytes no se recibe en el puerto serie y luego inicia la aplicación principal usando un puntero de función a la dirección 0.

El cargador de arranque funciona bien y puedo programar el AVR a través del puerto serie. Pero cuando el AVR solo contiene el cargador de arranque y la memoria flash en la ubicación 0 está vacía, se necesitan dos segundos además del tiempo de espera del cargador de arranque cada vez que se reinicia el AVR. ¿Por qué no es instantáneo? ¿Por qué el AVR no se reinicia inmediatamente cuando el cargador de arranque coloca el puntero en un área vacía en el flash? ¿Es esto algo que puedo configurar?

EDITAR: Mi acertijo del cargador de arranque en realidad resultó ser causado por PEBCAK . Un error en el ciclo de tiempo inicial en el cargador de arranque causó la demora adicional de dos segundos y se solucionó. Al saltar al inicio de una memoria flash en blanco/borrada, en realidad solo tomó unos pocos milisegundos antes de que el cargador de arranque se iniciara nuevamente, es decir, no fue un gran problema. Pero el mejor enfoque es verificar la ubicación de la memoria flash antes de saltar allí. Si se borra, simplemente reinicie el cargador de arranque en lugar de saltar al área vacía.

No existe tal cosa como "vacío". Hay algunos datos que se ejecutarán.
¿No acabas de decir que está usando estos 2 segundos para permitirte programarlo?
@EugeneSh. "Toma dos segundos además del tiempo de espera del cargador de arranque cada vez que se reinicia el AVR". En otras palabras, toma cuatro segundos cuando el tiempo de espera del cargador de arranque se establece en dos segundos. Entonces, cuando el puntero se establece en la dirección 0, que supongo que es todo 0xFF después de borrar el flash antes de programar el cargador de arranque, se reinicia después de exactamente dos segundos. Y luego toma dos segundos adicionales para volver a expirar. Y así va en un ciclo de cuatro segundos.
@PlasmaHH ¿Incluso cuando el flash se borra antes de que se programe el gestor de arranque? Entonces, ¿el flash no está configurado en 0xFF? ¿Qué sucede cuando el AVR intenta ejecutar 0xFF?
@Oystein: a menos que por "borrar" quiera decir "romper con un par de alicates", contiene algunos datos. 0xFF también son datos.
¿Tienes el código fuente del bootloader?
@PlasmaHH Estás afirmando lo obvio. Estoy preguntando qué sucede cuando el cargador de arranque, que reside en el otro extremo de la memoria flash, ordena el puntero de instrucciones al comienzo de la memoria flash, que se borra. ¿Por qué tarda dos segundos desde que esto sucede hasta que el gestor de arranque se inicia de nuevo? ¿Hay algo que controle este comportamiento que pueda configurar?
@EugeneSh. Sí, está basado en AVR109, así que tengo acceso al código fuente. El gestor de arranque simplemente se ejecuta en un bucle while durante dos segundos antes de llamar a un puntero de función establecido en la dirección 0 (que está vacío). Pero el gestor de arranque tarda otros dos segundos en volver a iniciarse, y mi pregunta es por qué.
¿Tiene alguna capacidad de depuración?
¿Dónde se encuentra la "aplicación principal" en el flash? ¿Cuál es la frecuencia de reloj de instrucción?
@EugeneSh. No, lamentablemente no tengo capacidades de depuración actualmente. La aplicación principal comienza en la dirección 0. ¿Frecuencia de reloj de instrucción? El AVR se ejecuta en un cristal externo de 16 MHz, si eso es lo que quieres decir...?
Espera... Así que no entendí la pregunta. ¿Quiere decir que una vez que lo haya borrado, le dará 4 segundos para programar? ¿Dónde está sentado el gestor de arranque? ¿Cómo sabe que tiene que saltar a la dirección del gestor de arranque al inicio?
Probablemente le tome dos segundos ejecutar todas las instrucciones desconocidas en el flash y volver al inicio del gestor de arranque.

Respuestas (1)

Bueno, la respuesta al comportamiento del sistema es "quién sabe" porque básicamente tiene un comportamiento indefinido porque no hay nada escrito para flashear en la MCU que intentará usar lo que sea que esté en la dirección 0 como vector de reinicio para la aplicación. si se borra, intentará usar 0xffff y no creo que el AVR emita una excepción cuando salga de los límites de la memoria y ejecutará alguna instrucción aleatoria y probablemente se quede allí hasta que el perro guardián u otra instrucción no válida provoque un reinicio. La mayoría de los cargadores de arranque tienden a verificar el valor en el vector de reinicio (generalmente la dirección 0) para verificar que no esté en blanco y, si lo está, simplemente activan el cargador de arranque indefinidamente para evitar que la MCU tenga un comportamiento indefinido.

+1. De hecho, los AVR solo ejecutarán instrucciones sin importar qué .
+1 @TomCarpenter Gracias por la información sobre AVR que solo se ejecuta a través de ubicaciones de memoria hasta que llega a una instrucción válida. Y para obtener información sobre el comportamiento "adecuado" del cargador de arranque (que debe verificar la memoria en la ubicación 0 antes de saltar allí).