Memoria en Arduino

Pronto...

1. Flash

Es la memoria de programa donde esta el bootloader y se almacenan los bocetos ya compilados. Se mantiene aun si apagamos nuestro Arduino. Usualmente entre 1~4 Mb. Es el equivalente al disco duro de un computador. Se puede ejecutar un programa desde la memoria flash, pero no es posible modificar los datos, sino que es necesario copiar los datos en la RAM para codificarlos. Esta memoria usa la misma tecnología que las USB (pendrive), tarjetas SD y algunos discos de estado solido. Esta memoria tiene una vida útil de unos 100,000 ciclos de escritura, así que cargando 10 programas al día durante 30 años podrías dañar la memoria flash de tu Arduino.

Ademas desde la versión 1.0 del IDE de Arduino, se introdujo la macro F(). Esta sintaxis se usa para almacenar cadenas en la memoria flash en lugar de en la RAM. No es necesario cargar ninguna librería para usar la macro F().

Serial.println("This string will be stored in flash memory"); //este print usa 42 bytes de memoria RAM con el contenido de la constante string
Serial.println(F("This string will be stored in flash memory"));

En el caso que el boceto ocupe más memoria flash, el IDE te avisa de que no puede cargarlo en Arduino. Cada vez que compilas un boceto el IDE de Arduino te informa de la memoria flash que ocupa el programa y la RAM ocupada por las variables globales y el espacio que queda para las variables locales. Como recomendación, si se supera el 70~75% de la RAM con las variables globales es muy probable que Arduino se quede sin memoria RAM para trabajar.

Recuerda que al incluir una librería, estas añadiendo pragamas y variables, lo que aumentará el uso de memoria flash y RAM. Algunas librerías hacen un uso intensivo de la memoria flash y RAM.

2. RAM

La Random Access Memory es volatil y es donde se almacena los registros, las variables locales y datos parciales. Es la zona de memoria donde el boceto crea y manipula las variables cuando se ejecuta. Es la mas rápida y la unica que puede se escrita desde el boceto en ejecución.

Es un recurso escaso que debe gestionarse, especialmente si usamos cadenas de caracteres de forma intensiva. Si un Arduino se queda sin memoria RAM, el boceto compila bien y se cargará en el Arduino sin problema, pero se producirán efectos de respuesta inesperados. En caso que necesites muchas cadenas, una técnica para evitar agotar la memoria RAM es guardar en la memoria flash las cadenas que no se modifiquen en tiempo de ejecución, usando PROGMEM osea F().

Es usada para los siguientes propositos:

La mayor parte de los problemas ocurren cuando los bloques Heap y Stack colisionan. Cuando esto ocurre uno o ambas bloques de memoria se corrompen con resultados impredecibles. En uno casos se produce un “cuelgue” del Arduino o resultados impredescibles.

Luego de compilar el bocetos, desde la versión 1.6 del IDE, Arduino informa sobre el tamaño de la RAM que sera ocupado por variables globales, es decir el bloque static data.

3. EPROM

Es una memoria no volátil para mantener datos después de apagado nuestro Arduino. Se puede grabar constantes desde un boceto con algunas instrucciones especiales. Al igual que la memoria Flash tiene una vida util de unas 100,000 ciclos de escritura. Esta memoria solo puede leerse byte a byte y su uso puede se un poco incómodo. También es algo más lenta que la RAM.

4. Capacidad

Memoria en cada Arduino
MemoriaArduino UNOArduino MEGAMKR1000
Flash32K256K256K
Flash-bootloader0.5K8K-
RAM2K8K32K
EPROM1K4K-