Saber cuánta memoria SRAM queda libre en Arduino

Llevo toda la tarde refactorizando el código de la estación de información para ahorrar toda la memoria SRAM posible pues el Arduino se reiniciaba continuamente por no disponer de ella.

Al principio pensaba que era por usar una estructura global para guardar los datos de los sensores todos juntos y así aumentar la legibilidad del código, pero no, algo de memoria debía de estar gastando pero no era la razón del problema…

Después probé a usar los tipos de datos exactos para el dato a guardar en ellos, es decir, si quería tener una variable para iterar en un bucle no podía usar una de tipo INT, que son  4 bytes, era mejor una de tipo BYTE, que es un 1 byte… así con todas, pero nada, el Arduino seguía reiniciándose.

Ya desesperado di con la funcion, que añado en el siguiente ejemplo, que permite saber cuanta memoria SRAM queda libre en el Arduino, libre o cuanta estamos gastando de mas, ya que el IDE solo nos muestra cuanta memoria FLASH estamos ocupando.

Pues bien, después de probar un montón de cosas al final di con el problema. Y cuál era? Pues que las dichosas funciones de impresión de la librería Serial cargan todos los textos en la memora SRAM en vez de leerlos de la memoria FLASH, esto hace que se agote muy facilmente, y mas en mi caso que tengo un comando que al ejecutarlo te emprime la ayuda de como usar la estación meteorológica… estaba gastando 620 bytes con la dichosa ayuda.

Para solucionarlo la he borrado y ahora la cargo desde un fichero almacenado en la SD, ahora me sobran 278 bytes 🙂

7 comentarios en “Saber cuánta memoria SRAM queda libre en Arduino”

    1. Hola!

      La función F() la probé y no compilaba, claro que uso el IDE 0022, no sabia que era propio del 1.0.1

      Lo de PROGMEM si que lo probé y tampoco compilaba, con las variables perfecto, con las cadenas también, pero con los textos de las funciones print no iba.

      Probé a poner los textos en cadenas con PROGMEM y después usar estos en las funciones print, pero en el momento en que usas una cadena en la función hace que se cargue en SRAM…

      Al final lo solucione quitando toda la ayuda, 640 bytes…, y poniéndola en un fichero de texto en la SD, ahora cargo todo desde ahí así que me ahorro toda esa memoria.

  1. Hola lo estoy probando en un attiny85 y el valor cambia de por ejemplo -27000 a 17000. esto es normal? que da cifras tan altas y positivos y negativos?

    me vendria muy bien saber cuanta ram le queda al bicho

    Gracias!

    1. Hola,

      Supongo que la forma de obtener esos datos o de realizar las operaciones matemáticas sera distinto con los ATtiny. Desde luego esos resultados no son nada normales.

      Saludos.

  2. ¡Hola muy buenas!
    Disculpa, ¿a qué te refieres con eso de que la cargas desde una SD? ¿Te refieres a que cargas sólo la ayuda? ¿Puedes explicarlo un poco más?
    ¡Gracias y felicidades por el blog, hoy estoy aprendiendo un montón!
    Alex.

    1. Hola Alex,

      Que en vez de almacenar las cadenas de texto largas en el propio código/sketch, las guardo en ficheros de texto en una memoria SD, y en caso de tenerlas que mostrar solo hay que leer el fichero deseado e imprimir esa información por pantalla/bluetooth/serial.

      También puedes rodear las cadenas de texto con la función F() que indica al arduino que esas cadenas debe leerlas desde la memoria flash o no cargarlas en la SRAM (acceso más lento pero se aprovecha más la memoria), cuando hice el código no existía esa posibilidad.

      Saludos.

Escriba aquí su comentario