En cierto modo, depende de lo que quieras decir con "arranque". En el nivel más bajo, el proceso de arranque es lo que hace la MCU cuando se enciende por primera vez, antes de que comience a ejecutar realmente el código de usuario. En un nivel superior, "arranque" puede referirse a lo que usted, como desarrollador, le indica al dispositivo que haga antes de iniciar el programa de aplicación real.
Antes de que la MCU pueda ejecutar cualquier instrucción, debe saber dónde encontrar esas instrucciones. En las piezas ARM, el procesador espera leer primero la tabla vectorial. Esta es una lista de al menos cuatro punteros:
- El puntero de pila inicial
- La ubicación de la rutina de restablecimiento
- la ubicación ISR de NMI
- La ubicación del ISR de falla dura
- Ubicaciones ISR adicionales, para cualquier interrupción que el dispositivo tenga que implementar (técnicamente éstas son opcionales)
Esta información se proporciona en la documentación ARM
La tabla de vectores normalmente estará al principio de su binario ejecutable, por lo que el procesador cargará la dirección de pila inicial en su puntero de pila, y luego saltará a la ubicación de la rutina de restablecimiento (el vector de restablecimiento).
Normalmente, el procesador espera encontrar la tabla de vectores al comienzo de la memoria flash. Algunas MCU tienen una memoria de configuración dedicada que se puede usar para indicar a la MCU que busque la tabla vectorial en una ubicación diferente. Algunas de estas partes tienen cargadores de arranque incorporados en la ROM dedicada, separados de la memoria flash normal, y pueden configurarse para ejecutar estos cargadores de arranque antes de iniciar la aplicación para permitir la actualización del firmware sin usar una sonda de depuración. Sin embargo, no parece que el S32K146 tenga estas opciones, de un vistazo rápido. Esto significa que la MCU siempre buscará la tabla vectorial al comienzo del flash cada vez que se encienda o se reinicie. Deberá consultar la documentación, en especial el Manual de referencia , para verificar esta. Para ver un ejemplo de un procesador que tiene esta función, puede mirar la serie STM32F4 de ST.
En un nivel superior, tiene libertad para escribir su propio código de inicio, que se ejecuta cuando el dispositivo se inicia por primera vez, y luego se "inicia" en la aplicación. Esta es una arquitectura de cargador de arranque convencional, en la que coloca su cargador de inicio al comienzo de flash, y cuando esté listo para ejecutar la aplicación real, el cargador de arranque puede hacer eso mediante:
- Actualización del Registro de compensación de la tabla de vectores a la dirección de la nueva tabla de vectores (generalmente al principio de su aplicación, donde sea que esté almacenada)
- Actualizando el puntero de pila al primer valor en la nueva tabla de vectores
- Saltando al vector de reinicio
En ese momento, el procesador comenzará a ejecutar su aplicación, casi como si se hubiera iniciado desde esa ubicación en primer lugar. Digo casi porque es importante darse cuenta de que este tipo de proceso de arranque NO restablecerá el estado de la MCU (en particular el estado de los periféricos) a sus valores de encendido. Esta es una de las razones por las que un programador defensivo será muy cuidadoso en sus rutinas de inicialización.
Una cosa adicional a tener en cuenta, en plataformas como ARM, es posible ejecutar código almacenado en cualquier lugar. Por lo tanto, es posible, por ejemplo, tener un gestor de arranque que carga una aplicación desde una memoria externa en la RAM de la MCU y luego ejecuta la aplicación desde la RAM. Esta capacidad a veces es aprovechada por las herramientas de depuración, que pueden escribir una pequeña aplicación en la RAM para hacer cosas como cargar datos en una memoria flash externa.