Optimización
La programación de bajo nivel para sistemas integrados es bastante diferente de la programación para dispositivos de uso general, como computadoras y teléfonos celulares. La eficiencia (en términos de velocidad y espacio) es mucho más importante porque los recursos son muy importantes. Eso significa que lo primero que debe hacer si se queda sin espacio es mirar qué partes de su código puede optimizar.
En términos de reducir el uso del espacio del programa (Flash), el tamaño del código puede ser bastante difícil de optimizar si no tiene experiencia o si está más acostumbrado a programar para computadoras de escritorio que no tienden a necesitar esa habilidad. Desafortunadamente, no existe un enfoque de 'bala mágica' que funcione para todas las situaciones, aunque ayuda si considera seriamente lo que realmente necesita tener su boceto . Si no se necesita una función, elimínela.
A veces también es útil identificar dónde varias partes de su código son iguales (o muy similares). Es posible que pueda condensarlos en funciones reutilizables que se pueden llamar desde varios lugares. Sin embargo, tenga en cuenta que a veces tratar de hacer que el código sea demasiado reutilizable en realidad termina haciéndolo más detallado. Es un equilibrio difícil de alcanzar que tiende a venir con la práctica. Dedicar un tiempo a observar cómo los cambios en el código afectan la salida del compilador puede ayudar.
La optimización de datos de tiempo de ejecución (SRAM) tiende a ser un poco más fácil cuando estás acostumbrado. Una trampa muy común para los programadores principiantes es utilizar demasiados datos globales. Todo lo declarado a nivel mundial existirá durante toda la vida útil del boceto, y eso no siempre es necesario. Si una variable solo se usa dentro de una función, y no necesita persistir entre llamadas, entonces conviértala en una variable local. Si un valor necesita ser compartido entre funciones, considere si puede pasarlo como un parámetro en lugar de hacerlo global. De esa manera, solo usará SRAM para esas variables cuando realmente lo necesite.
Otro asesino para el uso de SRAM es el procesamiento de texto (por ejemplo, usando la String
clase). En términos generales, debe evitar realizar operaciones de cadena si es posible. Son enormes cerdos de memoria. Por ejemplo, si está generando una gran cantidad de texto en serie, use varias llamadas a en Serial.print()
lugar de usar la concatenación de cadenas. También trate de reducir el número de literales de cadena en su código si es posible.
Evite la recursividad si es posible también. Cada vez que se realiza una llamada recursiva, lleva a la pila un nivel más profundo. Refactorice sus funciones recursivas para que sean iterativas.
Usar EEPROM
EEPROM se usa para el almacenamiento a largo plazo de cosas que solo cambian ocasionalmente. Si necesita utilizar listas grandes o tablas de búsqueda de datos fijos, considere almacenarlos en EEPROM por adelantado y solo extraiga lo que necesite cuando sea necesario.
Obviamente, EEPROM es bastante limitado en tamaño y velocidad, y tiene un número limitado de ciclos de escritura. No es una gran solución para las limitaciones de datos, pero podría ser suficiente para aliviar la carga de Flash o SRAM. También es bastante posible interactuar con un almacenamiento externo similar, como una tarjeta SD.
Expansión
Si ha agotado todas las demás opciones, la expansión puede ser una posibilidad. Desafortunadamente, no es posible expandir la memoria Flash para aumentar el espacio del programa. Sin embargo, es posible expandir SRAM. Esto significa que puede refactorizar su boceto para reducir el tamaño del código a expensas de aumentar el tamaño de los datos.
Obtener más SRAM es bastante sencillo. Una opción es usar uno o más chips 23K256 . Se accede a ellos a través de SPI, y existe la biblioteca SpiRAM para ayudarlo a usarlos. ¡Solo tenga en cuenta que funcionan a 3.3V, no a 5V!
Si está utilizando el Mega, también puede obtener escudos de expansión SRAM de Lagrangian Point o Rugged Circuits .