AVR- “Función principal del gestor de arranque y función principal de la aplicación”

1

Solo estoy tratando de construir un gestor de arranque personalizado para avr. Sé que las funciones del gestor de arranque se pueden compartir con el programa de aplicación. Aunque estoy realmente confundido con la función principal. ¿El gestor de arranque y el programa de aplicación, ambos tienen función principal? De lo contrario, 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;
    }
    
pregunta gzix

2 respuestas

3

Los mantendría separados.

Lo que puedes hacer es:

  • Cree dos programas, su gestor de arranque y su aplicación
  • Asegúrese de que estos dos programas estén vinculados a ubicaciones diferentes (por ejemplo, el cargador de arranque a 0x0 (vector de restablecimiento) y la aplicación a 0x20000 (dirección de la aplicación).
  • El cargador de arranque se iniciará después de un reinicio e inmediatamente después decidirá si debería iniciar las rutinas del cargador de arranque o si debería derivarse a la aplicación. Solo haga lo que sea absolutamente necesario para tomar esa decisión (las reglas para tomar esa decisión son suyas; por ejemplo, algún valor especial en flash o presionando un botón).
respondido por el Tom L.
2

Combinar el cargador de arranque y el programa principal en un binario no tiene sentido a menos que quieras lograr algo muy especial. Normalmente, el cargador de arranque se utiliza para actualizar / 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 todas las personas que están actualizando su dispositivo (actualización de firmware).

Cuando se ingresa el código del cargador de arranque (depende de los FUSOS), 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 unos segundos. Prefiero cuando hay una interfaz de usuario (botón, ...) probar rápidamente si el usuario quiere hacer flash de firmware (botón de retención después del ciclo de encendido o algo así).

    
respondido por el TMa

Lea otras preguntas en las etiquetas