ubicación del código del programa AVR

2

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 para mi chip:

Mapa de memoria de ATmega http://www.avr-tutorials.com/ sites / default / files / Memory% 20Map% 20Small.jpg

No comprendo dónde se ubica 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? ¿Debo usar la opción de vinculador "–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 el flash son desconocidos en el momento de la compilación.

    
pregunta Worakls

1 respuesta

1

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.

    
respondido por el theamk

Lea otras preguntas en las etiquetas