Estoy tratando de entender que si para STM32F405 MCU se usa un cargador de arranque personalizado en la MCU, entonces cada uno de los dos proyectos para el cargador de arranque personalizado y el código de la aplicación tendrán sus propios archivos "startup.s".
Lo que entiendo es que los dos binarios, es decir, el gestor de arranque y el código de la aplicación, residen en ubicaciones diferentes en la memoria flash.
Ahora, cuando el gestor de arranque personalizado salga y devuelva el control, el control debería pasar al código de inicio del código de la aplicación. Pero no sé cómo sucede realmente. ¿Los dos programas binarios residen en ubicaciones contiguas para que después de que finalice el gestor de arranque, la siguiente instrucción sea la del código de inicio?
¿O están en diferentes ubicaciones y de alguna manera la dirección de inicio del código de la aplicación se guarda como dirección de salto al final del binario del gestor de arranque?
¿Hará una diferencia en la forma en que se implementa realmente si uso el compilador Keil o GCC?
La imagen compilada de una aplicación STM32 comienza con una tabla de vectores, en la que la primera palabra contiene el valor del puntero de pila inicial, la siguiente tiene la dirección de la primera instrucción.
El cargador de arranque obviamente debe saber la dirección en la que se carga la aplicación (¿cómo podría cargarla de otra manera?), para que pueda ver las dos primeras palabras de la imagen que acaba de mostrar.
Debe tener en cuenta el diseño de los sectores flash al decidir la dirección de inicio de la aplicación. Si partes del cargador de arranque y la aplicación terminan en el mismo sector flash, entonces el cargador de arranque no podrá actualizar la aplicación.
Los diseñadores de este MCU habían dispuesto algunos sectores más cortos al comienzo del flash exactamente para este propósito. Es posible que desee reservar 32k para el cargador de arranque y colocar la aplicación en, 0x08008000
por ejemplo, depende de usted (y de la complejidad del cargador de arranque).
¿Hará una diferencia en la forma en que se implementa realmente si uso el compilador Keil o GCC?
La única diferencia estaría en los archivos de configuración del enlazador, que le indican al enlazador dónde cargar la aplicación. El enlazador GNU lo toma de un script de enlazador ( *.ld
), Keil lo llama archivo de dispersión . Tienen el mismo propósito, pero diferente sintaxis. También debe ajustar la secuencia de comandos del enlazador/archivo de dispersión del cargador de arranque, limitando la cantidad de flash disponible para él.
El compilador no importa, uno puede usarse para el gestor de arranque y otro para la aplicación. Primero escribes el cargador de arranque y ves qué tan grande es. Luego, redondea al límite del sector flash más cercano, ya que no desea borrar un sector con el código del cargador de arranque. Haga que el gestor de arranque salte al inicio del primer sector libre. Y luego indique al enlazador que genere código para que el código de la aplicación no se cargue al inicio de flash (el cargador de arranque está allí) sino al inicio del primer sector libre después del cargador de arranque.
chris stratton
alt-rosa