(30-07-2014, 08:51 AM)xavi escribió: Buenos dias.
Aún no he comentado el proyecto que tengo en mente. De momento tengo instalado un controlador en uno de los acuarios, basado en el que se desarrollo en otra página web (no se si se pueden hacer citas a otras páginas de acuarofilia), donde utilizo reles para las luces, y dimeo para 2 canales de leds de baja potencia (únicamente estético). Funciona sin problemas desde hace un año.
Me gusta trastear con Arduino; aunque no tengo formación en temas electrónicos, pero internet es una ventana abierta a la información, leyendo de uno y otros, adaptando códigos, etc.
Al leer tu blog, y ver los videos, me he quedado sorprendido por tu trabajo, de modo que voy siguiendo tus pasos a la espera de que vengan mas capítulos.
Sobre la memoria de los arduinos (te repito que no tengo demasiada idea), las pruebas de la botonera las realicé sobre un Arduino UNO (2 KB SRAM).
Sobre mi proyecto; estoy preparando los componentes para una pantalla para un acuario pequeño, con leds de 1w. Con el Arduino únicamente quiero controlar los canales de dimeo y el ventilador de la pantalla.
Una pregunta sobre la memoria; cuando compilas un sketch de arduino (350 líneas de código) , y dice “medida en binario=16.500 bytes”; ¿cómo interpreto si un Arduino Uno es válido para mi proyecto?.
Saludos y gracias
Bueno unas nociones de programación avanzada para Arduino no os van a hacer daño.
Hay tres tipos de memoria física en Arduino:
1) Memoria Flash (para el código)
2) SRAM (para variables)
3) Memoria EEPROM (para datos no volátiles).
Cada tipo de tarjeta ofrece cantidades diferentes de memoria.
Memoria Flash:
Se trata de una zona de memoria donde solo se usará la escritura para escribir en ella el código. Para el compilador esta memoria es de solo lectura. Se la llama PROGMEM y existe la posibilidad de incluir datos de solo lectura en esta zona en tiempo de compilación. Es una zona de memoria mucho más amplia que la SRAM.
Memoria SRAM:
Arduino trae poca memoria SRAM y hay que aprovecharla al máximo. Es la que se usa para contener datos de varuables. Es una memoria muy rápida tanto para lectura como oara escritura.
Memoria EEPROM:
Arduini no trae disco duro así que la EEPROM nos sirve para leer y escribir datos que no deseamos que se pierdan al apagarse Arduino.
Todo lo que sigue se refiere al uso de la SRAM que es la que puede dar más problemas a la hora de programar.
El compilador en la SRAM gestiona tres tipos de datos en tres zonas de memoria:
1) Stack (pila para variables locales de las funciones)
2) Head (memoria dinámica)
3) Static Data (variables globales)
En tiempo de ejecución: se gestionan las zonas de Stack y de la pila.
Al arrancar Arduino ejecuta setup() para inicializar lo que sea necesario.
Durante el proceso de inicialización de un programa se suele instanciar objetos (Instanciar = crear objeto y asignarlo a una variable) . Esto consume memoria. Son variables dinámicas (que se crean durante la ejecución) y que ocupan espacio. Nada impide usar memoria dinámica durante el resto de la ejecución del programa, (con malloc() o calloc() ) pero yo no lo hago. En los Arduinos de 8 bits la gestión de memoria dinámica es muy mala.
Así pues, una vez que completo el proceso setup(), ya tengo inicializadas las variables dinámicas que se van a usar en el mismo. Por esta razón, realizo habitualmente al final del proceso setup() una consulta sobre la cantidad de memoria libre.
Es una medida de precaución muy necesaria cuando se está desarrollando porque cuando queda muy poca memoria libre, existe el peligro de que programa empiece a fallar al realizar alguna tarea. Si no estás sobre aviso te vuelves loco buscando el fallo porque son errores que en Arduino no generan aviso de violación de segmento como en otros sistemas. Simplemente el programa se queda colgado o se reinicia.
Al entrar en una función las variables locales consumen memoria de la pila (Stack) y al salir la liberan. La memoria dinámica también usa SRAM (en la zona llamada heap) pero en Arduino de 8 bits no libera bien. Deja huecos y sigue creciendo hasta encontrarse con la zona de crecimiento de la pila. El Stack y el Heap son zonas de tamaño variable y para aprovechar todo el espacio crecen cada una de ellas en sentido contrario. El Heap de Arduino es muy rudimentario.
Por ejemplo: Si el programa me ha avisado que me quedan solo 300 bytes de SRAM, ya sé que en el momento que entre en un procedimiento que contenga variables locales que me ocupen más de 300 bytes, va a petar.
La imagen está sacada de una página que comenta estas nociones de la gestión de memoria por parte del ordenador y que está escrita en Ingles.
Optimizing SRAM
Si queréis hacer algo más que reutilizar código conviene dominar estos temas. También es interesante tener algo de idea para estar sobre aviso de los problemas derivados de la escasez de memoria.