En AVR-GCC, ¿cómo puedo saber qué variable estáticamente inicializada está usando mi RAM?

0

La variable no se muestra en el archivo MAP, por lo que es difícil rastrearla. Prefiero no tener que buscar manualmente todo el código fuente en busca de inicializadores estáticos.

    
pregunta bigjosh

1 respuesta

3

Si tienes una variable estáticamente inicializada como ...

const int numbers[] = { 12 , 13 , 4 , 17 , 12 , 9 };

... entonces no solo usará flash, sino también RAM aunque sea const . Para evitar que utilice RAM, debe hacer que PROGMEM , pero primero debe encontrar qué variable está usando la RAM, lo que puede ser muy difícil si se declara con el alcance static como este ...

static const int numbers[] = { 12 , 13 , 4 , 17 , 12 , 9 };

... desde entonces no se mostrará individualmente en el archivo MAP.

Para rastrear esto, usa la información de depuración en el archivo ELF. Aquí hay una línea de comando de Linux que usará BINUTILS para enumerar todas las variables en un archivo, incluidas las de ámbito estático ...

avr-readelf -a example.elf | sort -k 2

Las cosas entre __data_start y __data_end son las variables que se copiarán de flash a RAM ...

99: 00800100     0 NOTYPE  GLOBAL DEFAULT    1 __data_start
 1: 00800100     0 SECTION LOCAL  DEFAULT    1
38: 00800100    12 OBJECT  LOCAL  DEFAULT    1 _ZL7numbers
77: 0080010c     0 NOTYPE  GLOBAL DEFAULT    1 __data_end
91: 0080010c     0 NOTYPE  GLOBAL DEFAULT    1 _edata

Puedes ignorar el primer número. El segundo número es la dirección en el FLASH en el que aterrizaron los datos estáticos, y el tercer número es el número de bytes utilizados (en este caso 12 bytes). Ahora puede rastrearlos y convertirlos en PROGMEM y guardar algo de RAM.

    
respondido por el bigjosh

Lea otras preguntas en las etiquetas