Los cargadores de arranque en los sistemas embebidos pueden ser ligeramente diferentes de los ordenadores de propósito general en el sentido de que se puede configurar el procesador (en un espacio aparte de la memoria de código, a menudo "fusibles") para iniciar la ejecución desde una dirección de memoria diferente . Lo que esto permite es inyectar código (el cargador de arranque) que puede estar atento a una señal especial para hacer algo diferente (normalmente para reprogramar el dispositivo). Si no se ve la señal, el cargador de arranque suele redirigirse a la dirección de arranque tradicional y las cosas siguen su curso normal.
Lo que permite la ubicación de arranque ajustable es un único binario fijo para trabajar con y sin gestor de arranque, siempre y cuando al compilar el programa principal no se solape con la memoria utilizada para el gestor de arranque. Así que al programar el dispositivo, hay dos opciones aproximadas:
- Programe el dispositivo sólo con el programa principal y deje solo el fusible del cargador de arranque. Al reiniciar, el procesador comienza la ejecución del programa principal en la ubicación normal.
- Programa el dispositivo con el programa principal (sin modificar) y el cargador de arranque, y activa el fusible del cargador de arranque según corresponda. Al reiniciar, el procesador comienza la ejecución en el cargador de arranque, que puede hacer algo (por ejemplo, reprogramar) o nada (pasar el control a la ubicación normal).
Si el procesador no tiene un fusible de cargador de arranque y quieres un cargador de arranque, es un poco más complicado, pero aún es posible (por ejemplo, los cargadores de arranque ATtiny).
En cualquier caso, los sistemas embebidos no necesitan un gestor de arranque como los ordenadores. Cuando el procesador se enciende o se reinicia, se activa una interrupción de reinicio, que (debería) reinicializar la memoria y los periféricos al estado especificado en la hoja de datos. En un AVR, el contador de programa se pone a 0, así que el procesador coge lo que hay y se va. Si estás usando alguna interrupción, normalmente el primer grupo de direcciones de memoria son todas JMP xxxx
que sirve como tabla de vectores, pero si no tienes interrupciones, la lógica de tu programa puede empezar en ese momento.