Buscando Memory Leaks en Arduino

Una vez que nos lanzamos a programar nuestro Arduino, y conforme nuestro programa aumente de tamaño, nos encontraremos dos problemas:

· El primero: La poca memoria RAM de la que dispone el dispositivo (varía dependiendo de la versión. Por ejemplo el Arduino Mega dispone de 8KB)

· El segundo: Si venimos del mundo Java, en C/C++ no tenemos el equivalente al Garbage Collector, de modo que la memoria que reservemos, la tendremos que liberar explicitamente una vez no sea necesaria.

De manera, que si no recuperamos mediante las instrucciones “delete” o “free” las posiciones de memora que reservemos (típicamente declarando cadenas de caracteres). Iteración tras iteración de la función loop() nos iremos quedando sin memoria RAM. Factor que unido a la poca memoria de la que disponemos, hará que nuestro programa funcione bien solo unos minutos, momento a partir del cual pueden pasar tres cosas, dependiendo de haciendo que, nos quedemos sin memoria:

1. El programa se reinicia. Cuando se agota la memoria, el sistema se reinicia invocando a setup() y luego continua invocando iterativamente a loop() hasta el siguiente memory leak.

2. El programa comienza a tener un comportamiento extraño y aleatorio.

3. El programa se detiene.

Una vez que identifiquemos que tenemos un memory Leak, lo siguiente es localizarlo. Para ello, buscando en google un poco hemos encontrado el siguiente programa http://www.faludi.com/itp/arduino/Arduino_Available_RAM_Test.pde, que tiene programada precisamente una función que una vez invocada, nos devuelve la memoria disponible por el sistema:

De manera que con esta función, podremos localizar donde perdemos esos valiosos bytes de RAM:

Por ejemplo, en el siguiente programa, declaramos una cadena de caracteres que no liberamos. Como podemos ver en la consola de trazas de Arduino, perdemos memoria iteración tras iteración en la función loop(), haciendo que en poco tiempo la memoria disponible en el sistema sea nula.

Sin embargo, si una vez identificado el memory leak procedemos a liberarla con delete[], vemos que en cada iteración de la función loop() volvemos a disponer de la misma memoria RAM.

Deja un comentario