Detalles del cargador de arranque Arduino

11

¿Alguien puede explicar cómo funciona el gestor de arranque Arduino ? No estoy buscando una respuesta de alto nivel aquí, he leído el código y lo entiendo. También he leído esta otra publicación (incluso había sido uno de los que respondieron).

Hay una gran cantidad de interacción de protocolos que ocurre entre el IDE de Arduino y el código del gestor de arranque, lo que finalmente da como resultado una serie de instrucciones de ensamblaje en línea que autoprograman el flash con el programa transmitiéndose a través de la interfaz en serie.

Lo que no tengo claro es 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 está destinado a delegar a la ejecución del código cargado por el usuario.

Seguramente, de alguna manera app_startnecesita obtener un valor no NULL en algún momento para que todo esto se una. No veo eso 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 el 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 decodificador secreto que le dice al programa principal dónde está realmente app_start? ¿O tal vez es un conocimiento implícito aprovechado por el IDE de Arduino? Todo lo 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 simplemente girará sobre sí mismo para siempre ... ¿cuál es el truco?

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

Editar

Estoy interesado en intentar portar el cargador de arranque a un Tiny AVR (específicamente el ATTiny44A) que no tiene espacio de memoria separado para el código del cargador de arranque. Como me parece evidente 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 portar el cargador de arranque a un chip que no tiene esos fusibles y hardware soporte (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 / portar 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 main). Luego lo haría para que la 'dirección' en el código del cargador de arranque agregue un desplazamiento que me coloque justo después del final de main, y tenga 'app_start' configurado en esa dirección. ¿Estoy pensando en esto correctamente o me estoy perdiendo algo por completo? ¡Gracias!

EDITAR 2

FWIW, encontré un proceso documentado sobre cómo cargar bocetos de Arduino en un ATTiny85 , que es donde originalmente iba con esta pregunta ... creo que está bastante bien

vicatcu
fuente
1
stackoverflow.com/questions/3652233/arduino-bootloader/ ... Me preguntaba dónde fue mi respuesta ...
Nick T

Respuestas:

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

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

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

Toby Jaffey
fuente
¿dónde reside el código principal del gestor de arranque entonces ...
vicatcu
1
@Joby, ah, ok ... mira la actualización de mi pregunta: estoy interesado en intentar portar el gestor de arranque a un Tiny AVR que no tiene espacio de memoria separado para el código del cargador de arranque.
vicatcu
1
@Joby, por lo que el código del gestor de arranque se basa en "... el fusible de reinicio de arranque se puede programar para que el Vector de reinicio apunte a la dirección de inicio de Flash de arranque después de un reinicio. En este caso, el cargador de arranque se inicia después de un reinicio. "
vicatcu
3
¿Querías específicamente el gestor de arranque Arduino? Emula un programador STK500 y, como tal, es algo voluminoso. Hay una versión atmega8 en el directorio de cargadores de arranque que compila a menos de 1K con gcc-3, pero incluso eso te dejará bastante corto en el flash disponible.
Peter Gibson
3
¿realmente querrías un cargador de arranque? seguramente para un ATTiny es más probable que valga la pena programar el dispositivo utilizando un programador ICSP (como usbTinyISP)
SingleNegationElimination