Pregunta de novato planeta..
En un bootloader basicamente reservas un espacio de memoria flash para el mismo y no tocas esa memoria mientras grabas la otra. imagino que en eso estara el fatfs para manejar la SD etc.
Estoy en lo correcto?
La clave está en el archivo
Linker Script con el que compilas el programa, ahí le dices al enlazador en que dirección debe de empezar a colocar el programa. Eso hay que configurarlo cuando compilas el firmware, no cuando compilas el bootloader. Hay que ver cuanto ocupa el bootloader, cual es la última dirección de flash usada, y coger la primera dirección libre de la siguiente página para compilar el firmware.
Por ejemplo en el linker script que estoy usando para hacer el bootloader, el fichero stm32f407vg_flash.ld, nos encontramos entre muchas otras cosas con esto:
/* Memory Spaces Definitions */
MEMORY
{
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
CCRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K
}El parámetro
ROM ORIGIN nos está diciendo la primera dirección de la flash donde el enlazador debe de ubicar el programa, en este caso en la
0x08000000, también le dice al enlazador que el tamaño de la flash es de 1024K. Todo esto no lo tocamos para compilar el bootloader, pero si que habrá que tocarlo para compilar el firmware. Por ejemplo si el bootloader ocupa 40960 bytes, en hexadecimal 0xA000, el firmware tendría que ir al principio de la siguiente página de esa dirección, mirando el mapa de direcciones de la flash, eso sería la dirección
0x0800C000 (Sector o página 3), y el linker script para compilar el firmware quedaría así.
/* Memory Spaces Definitions */
MEMORY
{
ROM (rx) : ORIGIN = 0x0800C000, LENGTH = 1024K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
CCRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K
}Bueno, el tamaño de la flash disponible ya no serían 1024K, sino 1024K menos el tamaño del bootloader.
Tambien me encontre que en el micro que tengo de TI (TM4C1294NCPDT) la memoria flash esta "dividida" en 4 bancos asi hay un buffer que toma de a varios bytes ( y usa un LRU ) para seguir la velocidad del micro, puedo borrar de 16kB y escribir 32 palabras de 32bytes a la ves, pero si tengo que escribir en el mismo banco que esta mi bootloader deberia mudar el bootloader a la RAM, y ejecutarla de ahi. Ya que dice que mientras esta grabando se vuelve inacceesible el acceso al banco para otras cosas. Te ocurre algo parecido a vos con el de ST?
En un STM32F407 (1Mega de flash), la flash está dividida en 11 SEctores o páginas, y todos no son del mismo tamaño. Nunca escribo o reescribo sobre el bootloader, ni utilizo una página o sector ocupada por el Bootloader, porque si se está ejecutando en ese momento, se quedará bloqueado. Cuando el bootloader graba el firmware, lo hace a partir de la siguiente página o sector libre, y el borrado de la flash también lo hace a partir de la página que ocupa el firmware, el bootloader siempre queda intacto.
Y por ultimo en tu definicion de memoria lo dividis en bootloader y programa a toda la flash o le das una direccion especifica ? por ejemplo definis una seccion llamada bootloader. me explico con el codigo que poseo:
Aunque eso signifique poner algo en ASM :/, o como indicas que se almacene en cierto lugar.. me quede con los ORG 0x00 de los pics :/
El programa o firmware, como he indicado arriba, va en la primera página libre de la flash una vez cargado el bootloader, y eso se indica en el
linker script, cuando compilas, para que el enlazador lo ubique en esa dirección, sino machacaría al propio booloader. No hay que escribir nada en ensamblador.