Solo estoy tratando de construir un gestor de arranque personalizado para avr. Sé que las funciones del cargador de arranque se pueden compartir con el programa de aplicación. Sin embargo, estoy realmente confundido con la función principal. ¿El cargador de arranque y el programa de aplicación tienen una función principal? Si no, cómo escribir dos programas separados con una sola función principal
Programa de aplicación:
#include <avr/io.h> // application program at 0x0000
#include <string.h>
int main()
{
uart_init();
}
Programa de cargador de arranque:
#include <avr/io.h>
#include <avr/boot.h>
void uart_init();
void (*funcptr)( void ) = 0x0000;
int main(void)
{
uart_init();
//Boot or Goto Application program
}
void uart_init()
{
//UART initialization code;
}
Los mantendría separados.
Lo que puedes hacer es:
Combinar el gestor de arranque y el programa principal en un solo binario no tiene sentido a menos que desee lograr algo muy especial. El cargador de arranque se usa normalmente para flashear/actualizar el programa principal a través de la interfaz "normal" (USB, UART) y el código BL generalmente se carga solo una vez a través de ISP/JTAG. El código BL también puede admitir el cifrado para no proporcionar su código a todos los que están actualizando su dispositivo (actualización de firmware).
Cuando se ingresa el código del cargador de arranque (depende de los FUSE), debe tomar una decisión rápida si salta al código principal o permanece en el cargador de arranque. El cargador de arranque predeterminado de Arduino usa tiempos de espera para el encabezado del protocolo Stk en serie, lo cual es muy molesto porque prolonga cada proceso de arranque por un par de segundos. Prefiero cuando hay una interfaz de usuario presente (botón, ...) probar rápidamente si el usuario desea hacer que el firmware parpadee (mantenga presionado el botón después del ciclo de encendido más o menos).
gzix
tom l
gzix
tom l
gzix