Trucos para reducir el tamaño de tu sketch en Arduino
Hey Ho! Let’s Go! ¿Cómo van las cosas por ahí? ¿Ansioso por que llegue el Black Friday? Mientras esperas te hablo de un tema que no necesitas ahora mismo pero que algún día necesitarás: las memorias.
Sabes lo que es una memoria, tú mismo tienes una. Pero lo complicado es gestionarlas. Sí, en plural, porque hay varias y a veces se llenan y empiezan a aparecer mensajes en naranja chillón en el IDE avisando de que no hay memoria. Y si no hay memoria disponible tu programa no funciona. Solo queda una solución: ponerlo a dieta.
Las memorias de Arduino: flash, SRAM, EEPROM
En cada Arduino hay disponibles tres memorias: la flash, la SRAM y la EEPROM.
La memoria flash es la que seguramente más te suene. Es esa que puedes ver al terminar de compilar un programa de Arduino en el IDE de Arduino. Ese dato que se da es de la memoria usada flash. La memoria flash en sí es como la memoria de un USB (por eso las llamamos flash drive, o windows lo hace cuando conectas un pendrive en tu PC).
En esta memoria es dónde va a parar nuestro programa compilado. También contiene el bootloader (el gestor de arranque del dispositivo que le permite recibir el código por USB y olvidarte de utilizar una cosa muy complicada llamada ISP). Esta memoria permite guardar el programa pero las variables no se pueden modificar ‘on the go’. Digamos que esta memoria es como cuando guardas una película en tu USB, la tienes ahí pero para verla se va copiando a otra memoria cuando la ves.
Esta memoria de la que hablo es la SRAM. Las memorias RAM son memorias que al quitarles la corriente se borran. Sus datos solamente sirven mientras el pc, Arduino, etc… esté encendido. Al apagarlo se borra todo. Es por eso que se utilizan en Arduino para llevar las variables. Es más seguro así, porque imagínate que manejas con Arduino una sierra (vaya ejemplo el mío…). Ahora de repente se va la luz y vuelve a las dos horas. Si el encendido y apagado no estuviese en una variable en este tipo de memoria lo que pasaría es que a las dos horas volvería la luz y con ella se encendería de nuevo la sierra. A mí me parece peligroso… podrías tener las manos cerca de la sierra en ese momento.
Lo de la S delante de la palabra RAM especifica que es una memoria estática. Esto solamente quiere decir que esta tecnología no necesita refrescos (¡Una Coca-Cola por favor!), sino que la información que se pone ahí se queda ahí sin necesidad de recordarle a Arduino la información que tenía ahí guardada. Es una mera tecnología, no tiene más. La DRAM sí necesita refrescos (es una memoria dinámica, lo contrario de estática).
Por último está la EEPROM, una memoria que no se borra al apagarse. Se queda fija. Esta memoria no podía ser la panacea, su problema es que tienen un número limitado de escrituras y lecturas. No se van a acabar de hoy para mañana pero no se puede utilizar al mismo nivel que la SRAM. Se puede escribir unas 100.000 veces en la memoria EEPROM, pero no te asustes, supuestamente en la flash también. Así que podría decirse que van a durar lo mismo.
De hecho, no veo a nadie cortarse al subir sketches a su Arduino y modificarlos 20 veces antes de subir el definitivo. Así que relax 😉
Información básica sobre Proteción de datos
Responsable ➥ Sergio Luján Cuenca
Finalidad ➥ Gestionar el envío de correos electrónicos con artículos, noticias y publicidad. Todo relacionado con los temas de rufianenlared.com
Legitimación ➥ Consentimiento del interesado
Destinatarios ➥ Estos datos se comunicarán a MailRelay para gestionar el envío de los correos electrónicos
Derechos ➥ Acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la política de privacidad
Plazo de conservación de los datos ➥ Hasta que se solicite la supresión por parte del interesado
Información adicional ➥ Puedes encontrarla en la política de privacidad y el aviso legal
7 Trucos para ahorrar espacio en la memoria flash
Una vez conoces las distintas memorias, ahora hay que ir al problema: Reducir el espacio que ocupa el programa en la memoria flash. Ese es el dato que muestra Arduino y el que más toca la moral ya que si es muy grande no te deja subir el programa y solo queda una solución: ponerse a llorar.
Voy a ver si te doy algunos trucos para hacer reducir el tamaño del sketch mientras te suenas los mocos con tanta llorera:
#1 Reducir líneas: Aunque parezca una tontería no es lo mismo utilizar 20 líneas de código para encender 20 pines que utilizar solamente una mediante el uso de máscaras. Tampoco es lo mismo repetir 100 veces la misma operación que crear una función que permita repetir esa cosa cada vez que la llames. Y bueno, luego también hay trucos más piratas como utilizar atajos: Si en lugar de escribir 4 líneas con un bucle while normal y unas características puedo escribir un bucle for que me ahorre líneas pues todo ocupará menos.
void micasa(){ Serial.println("ET, mi casa\n"); }
#2 Utilizar solamente los bytes necesarios: Claro, cuando programas te vuelves loco a crear variables y contra más grandes mejor. Pero hay que saber ahorrar. Si necesitas una variable para saber si algo está encendido o apagado utiliza un bool (tienen dos estados true o false). El bool es un bit, si utilizas un int estarás utilizando 4 bytes que son 32 bits. 32 bits para utilizar solamente uno….
#3 El tamaño de los buffers importa: Lo mismo te digo con buffers, matrices, cadenas,… todo aquello que sean conjuntos de elementos, fijémonos cuántos elementos tenemos. Si estás utilizando un vector que utilizas de diccionario y tiene 20 caracteres… pon el tamaño de 20, no de 50.
char vocales[5]={'a','e','i','o','u'};
#4 Utiliza variables: Las variables ahorran espacio porque son algo fijo. Si voy a hacer bucles siempre de un tamaño de 20, creo una variable que valga 20 y la llamo todo el tiempo. Esto ahorra espacio porque no hay que crear de nuevo el tamaño cada vez, simplemente se crea un enlace a ese 20 que añadí en primer momento.
#5 Utilizar la EEPROM, pero sin viciarse: También puedes enviar cosas a la memoria EEPROM de manera que vacíes el valor de algunas variables que siempre utilices de la memoria flash. Un ejemplo sería este:
void setup() { byte a = 20 } void loop() { EEPROM.write(a,10); int lectura=EEPROM.read(a); }
#6 Cárgate librerías: A veces empiezas utilizando un motor paso a paso pero con el tiempo llegas a la conclusión que un servo será más útil. Pues no cuesta nada borrar la línea de la librería del motor paso a paso y así ahorrar espacio al compilar el programa. Lo mismo te digo para las variables que no utilizas: ¡elimínalas!
#7 La F ahorra espacio: Cuando escribes un Serial.println() ocupas espacio en flash y luego en SRAM ya que se envían ahí como variables. Pero claro… esa variable no la utilizas nunca más. Creas una variable que siempre es y será la misma frase. Utilizando la F tendrás el poder de enviar esto a la memoria EEPROM directamente, por lo que ahorrarás espacio en la memoria flash
Serial.println(F("Rufián en la Red mola mogollón :P\n"));
Qué mala memoria la mía… me tengo que marchar que había quedado
Así que, si eres un desmemoriado, espero que te hayan resultado útiles ests pequeños trucos. A mí solamente me ha pasado una vez lo de la falta de memoria pero puede pasar al principio. Sobretodo si quieres hacer un programa muy sencillo pero muy extenso y te lías a no compactar cosas.
Pero ya te digo, no es lo normal. Y menos si estás intentando encender un led. Pero que sepas que hay modos de intentar hacer un apaño a todo esto y que quepan bien en Arduino. De hecho, en todos los microcontroladores los programadores padecen con la memoria e intentan que se quede al mínimo.
Aunque supongo que eso será porque están prototipando algún cacharro. Y cuanta menos memoria se utilice más pequeña pueden comprar la memoria flash, y esto siempre es un ahorro de dinero. Déjame un comentario ahí debajo si eres o has sido un desmemoriado alguna vez. Desenmascarémonos 😉
Déjame un comentario que en el fondo soy buen chaval
Excelente lo de la F para mandar cadenas de texto! Me salvó de tener que repensar todo el codigo de nuevo.