Detalles del cargador de arranque Arduino

11

¿Puede alguien explicar cómo Arduino bootloader funciona? No estoy buscando una respuesta de alto nivel aquí, he leído el código y entiendo lo esencial. También he leído esta otra publicación (incluso fui uno de los que respondieron).

Hay una gran cantidad de interacción de protocolo que ocurre entre el IDE de Arduino y el código del cargador de arranque, lo que en última instancia da como resultado una serie de instrucciones de ensamblaje en línea que programan automáticamente el flash con el programa que se transmite a través de la interfaz serial.

Lo que no tengo claro está en la línea 270:

void (*app_start)(void) = 0x0000; 

... que reconozco como la declaración, y la inicialización a NULL, de un puntero de función. Hay llamadas posteriores a app_start en lugares donde el gestor de arranque tiene la intención de delegar en la ejecución del código cargado por el usuario.

Seguramente, de alguna manera, app_start necesita obtener un valor que no sea NULL en algún momento para que todos se unan. No veo que en el código del gestor de arranque ... ¿está mágicamente vinculado por el programa que se carga por el gestor de arranque? Supongo que la principal del gestor de arranque es el punto de entrada al software después de un reinicio del chip.

¿Envuelto en las aproximadamente 70 líneas de ensamblaje debe ser el anillo secreto del decodificador que le dice al programa principal dónde está realmente app_start? ¿O quizás es un conocimiento implícito aprovechado por el IDE de Arduino? Lo único que sé es que si alguien no cambia app_start para apuntar a otro lugar que no sea 0, el código del gestor de arranque solo girará sobre sí mismo para siempre ... ¿cuál es el truco?

En una nota aparte, ¿sería posible que el código del cargador de arranque se base en interrupciones o es un no-no?

Editar

Estoy interesado en intentar portar el cargador de arranque a un AVR Tiny (específicamente el ATTiny44A) que no tiene espacio de memoria separado para el código del cargador de arranque. Cuando me doy cuenta de que el código del cargador de arranque se basa en ciertas configuraciones de fusibles y compatibilidad con chips, supongo que lo que realmente me interesa saber es qué se necesita para trasladar el cargador de arranque a un chip que no tenga esos fusibles y hardware. ¿Apoyo (pero aún tiene capacidad de autoprogramación)?

Estaba pensando que podría usar la implementación de AVR307 para usar el USI como un UART semidúplex (usa la interrupción Timer0 y la interrupción de cambio de pin). ¿Alguien puede ofrecer orientación sobre cómo escribir / transferir el código del cargador de arranque para un chip que no tiene soporte de hardware para los cargadores de arranque?

Supongo que pondría mi código del gestor de arranque en la ubicación normal para la dirección principal (por ejemplo, 0x029e o donde el compilador ponga la principal). Luego lo haría para que la 'dirección' en el código del gestor de arranque agregue un desplazamiento que me ponga más allá del final de main, y tenga 'app_start' configurado en esa dirección. ¿Estoy pensando en esto correctamente o me estoy perdiendo algo? Gracias!

EDIT 2

FWIW, encontré un proceso documentado para cómo cargar bocetos de Arduino en un ATTiny85 , que es donde estaba Originalmente con esta pregunta ... bastante limpio, creo

    
pregunta vicatcu

1 respuesta

12
void (*app_start)(void) = 0x0000; 

Esto no es un puntero NULO. Esta es realmente la dirección de inicio del código de la aplicación, a la que el gestor de arranque salta. El enlazador dispone que el código de su aplicación comience en la dirección 0. Consulte la tabla 26-6 en la hoja de datos de ATMEGA168.

El código del gestor de arranque comienza más arriba en flash. Exactamente donde depende de los fusibles del cargador de arranque.

    
respondido por el Toby Jaffey

Lea otras preguntas en las etiquetas