Comportamiento del microcontrolador AVR que solo contiene el cargador de arranque

1

Estoy trabajando en una implementación de AVR109, donde el cargador de arranque se apaga después de dos segundos si no se recibe una serie de bytes en el puerto serie, y luego inicia la aplicación principal usando un puntero de función para direccionar 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 demoran dos segundos además del tiempo de espera del cargador de arranque cada vez que se reinicia el AVR. ¿Por qué no es esto instantáneo? ¿Por qué el AVR no se reinicia inmediatamente cuando el gestor de arranque establece el puntero en un área vacía en la memoria flash? ¿Es esto algo que puedo configurar?

EDITAR: Mi problema con el gestor de arranque realmente fue causado por PEBCAK . Un error en el bucle de tiempo inicial en el cargador de arranque causó el retraso adicional de dos segundos, y fue corregido. 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 de nuevo, es decir, no es 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 gestor de arranque en lugar de saltar al área vacía.

    
pregunta Oystein

1 respuesta

3

Bueno, la respuesta al comportamiento del sistema es "quién sabe" porque básicamente tienes un comportamiento indefinido porque no hay nada escrito para actualizar a la MCU. Intentará usar lo que esté en la dirección 0 como el vector de restablecimiento 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 se establecen. La mayoría de los cargadores de arranque tienden a verificar el valor en el vector de restablecimiento (generalmente la dirección 0) para verificar que no esté en blanco y, si es así, simplemente realizan un bucle indefinido en el cargador de arranque para evitar que la MCU tenga un comportamiento indefinido.

    
respondido por el Kvegaoro

Lea otras preguntas en las etiquetas