Muchas de las cosas del arduino se manejan por debajo. Verás cuánta memoria FLASH ocupará un sketch (programa) al compilarlo, pero no la cantidad de memoria SRAM. Recientemente tuve que descubrir esto también, y así es como lo hice.
En el directorio del IDE de arduino está el compilador avr-gcc. También contiene una herramienta llamada 'avr-size'. Ve a hardware/tools/avr/bin/ y debería estar ahí.
Al compilar, el IDE creará un directorio temporal en su directorio temporal y copiará todos los archivos C(++) en él. Compilará las librerías, tu sketch (también añade las cosas necesarias para que sea funcional) y creará un archivo hexadecimal y elf. Lo que necesitas hacer es compilar tu sketch (haciendo clic en cargar o verificar) y buscar un directorio build[hash tag] en tu carpeta temporal. Necesitas ejecutar avr-size.exe y entregarle el archivo elf.
Es un trabajo de consola bastante tedioso, pero normalmente navego a la carpeta bin, ejecuto avr-size.exe y escribo la ruta a mi carpeta temporal. Esto es C:\Users [su nombre de usuario] \AppData\Local\Temp\build [etiqueta aleatoria][nombre del boceto].cpp.elf (Windows 7)
Probablemente se podría hacer algún (lote) script para esto, pero como la carpeta de construcción se mantiene constante en cada sesión de arduino, no me molesto.
La salida de avr-size se parece mucho a esto (he compilado un programa de ejemplo de Xbee). ![Console output]()
Dónde:
- texto - datos flash utilizados para el código
- data - Memoria con los datos inicializados (¡el valor inicial debe almacenarse también en la FLASH!)
- bss - Memoria que se inicializa con ceros (el compilador añadirá algo de código para que se inicialicen los datos y bss)
- dec & hex son una visualización decimal y hexadecimal del tamaño combinado de RAM y FLASH de tu programa.
El IDE de Arduino me informó que este programa es de 3956 bytes (FLASH). Eso está relacionado con 3924 (código flash) + 32 (valores iniciales de RAM) = 3956 bytes FLASH. El uso de la RAM es datos+bss combinados(!) = 32+320 = 352 bytes de uso de SRAM.
Ten en cuenta que el ATMEGA328 sólo tiene 2KiB de SRAM, y ya pueden surgir problemas si estás por debajo de eso (he tenido comportamientos inesperados a 1700 bytes de 2048). El ATMEGA168 tiene 1KiB de SRAM. Todos los Arduino mega tienen 8KiB de SRAM.
Como nota adicional. También existen códigos "indicadores de memoria libre". Lo que hacen es tratar de asignar la mayor cantidad de memoria , contar cuán grande era y liberarla (malloc() & free()). Si inicialmente no has usado malloc, esto añadirá más código a tu programa para el que a veces no tienes espacio. Esto no es lo ideal y tampoco he encontrado que dé resultados estables. En mi propio proyecto tenía ethernet+xbee+tarjeta SD + código de biblioteca propia corriendo en un Atmega328. Simplemente no había suficiente SRAM disponible, y la FLASH también escaseaba).
Y por último, pero no menos importante, este indicador no tiene en cuenta la memoria asignada con malloc().