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.
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.
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.