Estoy trabajando con un ATmega328P y quería interactuar con la memoria flash escribiendo datos con las macros proporcionadas por avr-libc . Este es el mapa de memoria de mi chip:
(fuente: avr-tutorials.com )
No entiendo dónde se encuentra exactamente el código del programa cuando se compila. Lo que quiero decir es: ¿Cómo puedo estar seguro de que la dirección que uso en boot_page_fill y boot_page_write no se usa para el código del programa? ¿Necesito usar la opción del enlazador "–section-start" para mover el código del programa a una ubicación específica y asegurarme de que la página flash que voy a usar no sobrescriba ese código?
NOTA: Los datos para escribir en la memoria flash se desconocen en el momento de la compilación.
A menos que sintonice su enlazador, el programa siempre comenzará en la dirección 0 y crecerá. Además, si tiene un gestor de arranque, comenzará en una de las direcciones predefinidas (ya sea 0xF80, 0xF00, 0E00 o 0xC00, consulte la tabla 26-7 en la hoja de datos) y, por lo general, irá a la parte superior de la memoria.
Cuando las personas usan la memoria flash para datos, generalmente la colocan lo más alto posible. Entonces:
(1) Determine la parte superior de la memoria; esto depende del gestor de arranque que tenga. Si tiene Optiboot, generalmente toma 512 o 256 palabras: https://code.google.com/p/optiboot/wiki/HowOptibootWorks , por lo que asumiremos que comienza en 0xE00.
(2) Determine cuántos datos necesita. Digamos que necesita 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) Escriba su programa.
(4) Compruebe 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í, haga su programa más corto. De lo contrario, el programa se compilará y cargará, pero se bloqueará aleatoriamente.
Ignacio Vázquez-Abrams
Trabajos
Ignacio Vázquez-Abrams
TMa
Rdo
Trabajos
Rdo
Trabajos
Rdo
Codebeat