Optimizando la memoria RAM de nuestro Arduino

Este pequeño truco para optimizar la memoria RAM de sus Sketches puede en algunos casos ser la diferencia entre un Sketch que entre en un Arduino pequeño y uno que no. Como muchos saben, nuestros Arduinos tienen 3 tipos de memorias: Flash (ROM), SRAM (RAM) y EEPROM. En la mayoría de los casos la memoria SRAM es muy limitada (por ejemplo en un Arduino UNO es de solo 2048 bytes) y optimizar su uso es un muy buen recurso para tener a mano.

Una de los trucos más simples y menos difundidos es el que permite que los textos estáticos (por ejemplo textos fijos en nuestro programa como cuando enviamos texto por el puerto USB), ocupen memoria Flash y no memoria SRAM.

El siguiente es un código típico de un texto enviado por USB (deberá abrir el monitor Serie y configurarlo a 9600 bps):

// Librería para evaluar la memoria SRAM disponible
#include "MemoryFree.h"

void setup() {
    Serial.begin(9600);

    // Mostramos el texto de ejemplo por el Monitor Serie
    Serial.println("Texto de ejemplo");
    // Mostramos la memoria SRAM disponible con este Sketch
    Serial.println(freeMemory());
}

void loop() {
}

Para que el Sketch funcione deberán disponer de la librería MemoryFree que podrán encontrar aqui: https://github.com/maniacbug/MemoryFree/archive/master.zip

La salida del Sketch cargado en un Arduino UNO mostrará algo similar a:

Texto de ejemplo
1826

El mismo Sketch optimizado mediante el uso de la macro función F() se vé así:

// Librería para evaluar la memoria SRAM disponible
#include "MemoryFree.h"

void setup() {
    Serial.begin(9600);
 
    // Mostramos el texto de ejemplo por el Monitor Serie
    Serial.println(F("Texto de ejemplo"));
    // Mostramos la memoria SRAM disponible con este Sketch
    Serial.println(freeMemory());
}

void loop() {
}

y la salida del mismo es diferente:

Texto de ejemplo
1844

La diferencia de 18 bytes se debe a que el texto que mostramos por el Monitor Serie en el segundo Sketch está dentro de la macro función F() y la misma le dice a Arduino que dicho texto lo guarde en la memoria Flash y lo use directamente desde ahi, mientras que en el primer caso el texto es copiado a la memoria SRAM antes de ser usado por el Sketch (comportamiento interno del Arduino).

De esta manera, podemos usar la macro función F() con todos nuestros textos estáticos para liberar más memoria SRAM segun lo necesitemos.