8 votos

Comprobación de la huella de memoria en Arduino

Estoy trabajando en un proyecto sencillo con mi Arduino. Recientemente he tenido que convertir una de mis variables a un long en lugar de un int, y para mantener las cosas simples sólo he pasado por encima de todos los números con los que interactúa (para no tener que preocuparme de las comparaciones de tipo cruzado y otras matemáticas). Esto parece un desperdicio, pero es sólo un reloj para mí, y no me importa mucho.

Sin embargo, me ha hecho reflexionar sobre la cantidad de memoria que estoy utilizando. Dudo que sea un problema, pero me he dado cuenta de que no conozco ninguna forma de comprobarlo.

Entonces, ¿hay alguna forma de comprobar la cantidad de memoria que utiliza un Arduino?

Idealmente, me gustaría imprimir la memoria actual / total disponible a través de la conexión en serie.

8voto

Avner Puntos 2065

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

1voto

0xA3 Puntos 128

Pruebe a utilizar el MemoriaLibre biblioteca. Esto me ha funcionado bien hasta ahora.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X