Memoria y optimización
1. Tipos de memoria en Arduino #
Arduino (por ejemplo, la placa UNO) tiene tres tipos principales de memoria:
| Tipo | Función | Tamaño en UNO |
|---|---|---|
| Flash | Almacena el programa (código) | 32 KB |
| SRAM | Memoria RAM (datos durante la ejecución) | 2 KB |
| EEPROM | Memoria no volátil (almacenamiento permanente de datos) | 1 KB |
2. Variables y memoria #
Variables globales y locales #
- Globales: ocupan espacio en la SRAM durante toda la ejecución.
- Locales: ocupan memoria solo mientras se ejecuta la función.
Ejemplo: #
1int global = 100; // ocupa SRAM todo el tiempo 2 3void loop() { 4 int local = 10; // solo vive mientras se ejecuta loop() 5}
💡 Recomendación: usa variables locales siempre que sea posible para ahorrar SRAM.
3. Cadenas de texto (String vs char[]) #
Usar la clase String puede generar fragmentación de memoria en Arduino, lo cual reduce la estabilidad del sistema.
Alternativa eficiente: usar arreglos de char #
1char mensaje[] = "Hola, mundo!"; 2 3void setup() { 4 Serial.begin(9600); 5 Serial.println(mensaje); 6}
⚠️ Consejo: Evita String si tu proyecto es grande o maneja muchas cadenas dinámicas.
4. Uso de F() para ahorrar SRAM #
Puedes almacenar cadenas directamente en la memoria Flash usando la macro F():
1Serial.println(F("Este texto está en memoria Flash"));
Esto evita que la cadena se copie a SRAM, lo cual es ideal para textos largos o mensajes de depuración.
Almacenar tablas y arreglos constantes en Flash con PROGMEM #
Para arreglos grandes de solo lectura (como tablas de búsqueda o mapas de caracteres):
1#include <avr/pgmspace.h> 2 3// Guardar array en memoria Flash en vez de SRAM 4const byte mapaBits[] PROGMEM = {0x00, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00}; 5 6// Para leerlo en tiempo de ejecución: 7byte dato = pgm_read_byte_near(mapaBits + indice);
5. Leer y escribir en EEPROM #
La EEPROM permite guardar datos que se conservan después de apagar la placa.
1#include <EEPROM.h> 2 3void setup() { 4 EEPROM.write(0, 42); // Guardar valor 42 en dirección 0 5 int valor = EEPROM.read(0); // Leer desde dirección 0 6 Serial.begin(9600); 7 Serial.print("Valor EEPROM: "); 8 Serial.println(valor); 9}
⚠️ Importante: La EEPROM tiene un número limitado de escrituras (~100.000), así que no la uses para datos que cambian constantemente.
6. Técnicas de optimización #
Usa el tipo de dato más pequeño posible: #
byteen lugar deintsi solo necesitas valores entre 0 y 255.boolpara variables lógicas.
1byte contador = 0; 2bool activo = true;
Reutiliza variables #
- Evita declarar múltiples variables para lo mismo dentro de
loop().
Reduce uso de delay() #
- Prefiere
millis()para evitar bloqueos innecesarios y aprovechar mejor el tiempo de ejecución.
Elimina Serial.print() en producción #
- El envío constante de mensajes ocupa memoria y ralentiza el programa.
Resumen del tema
Conceptos clave #
- Arquitectura de Memoria en AVR:
- Flash (32 KB): memoria de solo lectura para el sketch cargado.
- SRAM (2 KB): memoria volátil para variables globales, locales y pila de ejecución.
- EEPROM (1 KB): almacenamiento persistente no volátil para configuraciones permanentes.
- Macro
F(): almacena cadenas de texto constantes directamente en Flash (Serial.println(F("..."))), liberando valiosa SRAM. - Optimización de Tipos: empleo de
byte(0-255) yboolen lugar deint, y preferencia por variables locales frente a variables globales persistentes. - Uso de EEPROM: operaciones
EEPROM.write()yEEPROM.read()teniendo en cuenta su vida útil limitada (~100.000 escrituras).
Qué debes recordar #
El uso de la macro F("texto") y la selección de tipos de datos compactos (byte, bool) son las formas más eficaces de evitar el agotamiento de la SRAM en microcontroladores.