Comprobando la huella de memoria en Arduino

6

Estoy trabajando en un proyecto simple con mi Arduino. Recientemente tuve que convertir una de mis variables a un largo en lugar de un int, y para mantener las cosas simples, simplemente me moví sobre todos los números con los que interactúa (por lo que no tengo que preocuparme por las comparaciones de tipo cruzado y otras matemáticas). Esto parece un desperdicio, pero es solo un reloj para mí, y no me importa mucho.

Sin embargo, me hizo preguntarme sobre cuánta memoria estoy usando. Dudo que sea un problema, pero me di cuenta de que no conozco ninguna forma de comprobarlo.

Entonces, ¿hay alguna forma de verificar 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.

    
pregunta MrGlass

2 respuestas

7

Muchas de las cosas de arduino se manejan debajo. Verá la cantidad de memoria FLASH que tomará un boceto (programa) en la compilación, pero no la cantidad de memoria SRAM. Recientemente tuve que descubrir esto también, y así es como lo hice.

En el directorio de arduino IDE está el compilador avr-gcc. También contiene una herramienta llamada 'avr-size'. Vaya a hardware / herramientas / avr / bin / y debería estar allí.

Al compilar, el IDE creará un directorio temporal en su directorio temporal y copiará todos los archivos C (++) en él. Compilará las bibliotecas, su boceto (también agrega las cosas necesarias para hacerlo funcional) y creará un archivo hexadecimal y elfo. Lo que debe hacer es compilar su boceto (haciendo clic en Cargar o verificar) y buscar un directorio de compilación [etiqueta hash] en su carpeta temporal. Debe ejecutar avr-size.exe y entregarle el archivo elf.

Es un trabajo de consola bastante tedioso, pero generalmente 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 bosquejo] .cpp.elf (Windows 7)

Probablemente podrías crear un script (por lotes) para esto, pero como la carpeta de compilación permanece constante en cada sesión de arduino, no me molesto.

La salida de avr-size se ve muy similar a esto (he compilado un programa de ejemplo Xbee).

Donde:

  • texto: datos flash utilizados para el código
  • datos: memoria con datos inicializados (¡el valor inicial también debe almacenarse en FLASH!)
  • bss: memoria que se inicializa con cero (el compilador agregará algo de código para que inicialice los datos & bss)
  • dec & hex es una visualización decimal y hexadecimal del tamaño combinado de RAM y FLASH de su programa.

El IDE de Arduino que me informó que este programa tiene 3956 bytes de tamaño (FLASH). Eso está relacionado con 3924 (código flash) + 32 (valores RAM iniciales) = 3956 bytes FLASH. El uso de RAM es data + bss combinado (!) = 32 + 320 = 352 bytes de uso de SRAM.

Tenga en cuenta que el ATMEGA328 solo tiene 2KiB de SRAM, y los problemas ya pueden ocurrir si está por debajo de eso (he tenido comportamientos inesperados a 1700 bytes de 2048). El ATMEGA168 tiene 1KiB de SRAM. Todos los mega de Arduino tienen 8KiB de SRAM.

Como nota adicional. También hay un código de 'indicadores de memoria libre' disponible. Lo que hacen es tratar de asignar tanta memoria, contar el tamaño que tenía y liberarla (malloc () & free ()). Si inicialmente no ha usado malloc todavía, esto agregará más código a su programa para el que a veces no tiene espacio. Esto no es ideal y tampoco lo he encontrado para dar resultados estables. En mi propio proyecto tenía ethernet + xbee + tarjeta SD + código de biblioteca propio que se ejecutaba en un Atmega328. Simplemente no había suficiente SRAM disponible, y FLASH también se volvió escasa).

Y por último, pero no menos importante, este indicador no tiene en cuenta la memoria asignada con malloc ().

    
respondido por el Hans
1

Intente utilizar la biblioteca MemoryFree . Esto me ha funcionado bien hasta ahora.

    
respondido por el amicitas

Lea otras preguntas en las etiquetas