A menos que sintonice su vinculador, el programa siempre comenzará en la dirección 0 y crecerá. Además, si tiene un gestor de arranque, se iniciará en una de las direcciones predefinidas (0xF80, 0xF00, 0E00 o 0xC00, consulte la tabla 26-7 en la hoja de datos) y, por lo general, va a la parte superior de la memoria.
Cuando las personas usan la memoria flash para los datos, generalmente la colocan lo más alto que pueden. Entonces:
(1) Determine la parte superior de la memoria: esto depende del cargador de arranque que tenga. Si tiene Optiboot, generalmente toma 512 o 256 palabras: enlace , por lo que asumiremos que comienza en 0xE00.
(2) Determine cuántos datos necesita. Digamos que necesitas 256 (0x100) bytes. Esto significa que colocará su bloque de datos en 0xE00 - 0x100 = 0xD00. Puede pasar valores entre 0xD00 y 0xDFE a las funciones boot_page_ *.
(3) Escribe tu programa.
(4) Comprueba cuánto espacio ocupa. Puede tomar hasta (0xD00 - 1) = 3328 bytes. Cuando compilo desde la línea de comandos, uso 'avr-size' para eso:
$ avr-size -C --mcu=atmega328 firmware.elf
AVR Memory Usage
----------------
Device: atmega328
Program: 904 bytes (2.8% Full)
(.text + .data + .bootloader)
Data: 2 bytes (0.1% Full)
(.data + .bss + .noinit)
Mire la sección 'programa': solo se usan 904 bytes, queda mucho espacio. Si ve un número de 3328 o más allí, acorte su programa. De lo contrario, el programa se compilará y cargará, pero se bloqueará aleatoriamente.