PROGMEM
Descripción
Almacena datos en la memoria flash (memoria de programa) en lugar de la SRAM. En este enlace hay una descripción de varios tipos de memoia disponibles en una placa Arduino.
La palabra clave PROGMEM es un nodificador de variable, debe ser usada solo con los tipos de datos definidos en la biblioteca pgmspace.h. Se le dice al compilador "poner esta información en la memoria flash", en lugar de en la SRAM, donde normalmente iría.
PROGMEM es parte de la biblioteca pgmspace.h que está disponible solo en la arquitectura AVR. Por lo que primero necesita incluir la biblioteca en la parte superior de su boceto, como esto:
#include <avr/pgmspace.h>
Mientras que PROGMEM podría ser utilizado con una sola variable, realmente sólo vale la pena el trabajo si se tiene un bloque más grande de datos que necesitan ser almacenados, que suele ser más fácil en una matriz, (u otra estructura de datos C más allá de nuestra presente discusión).
El uso de PROGMEM es un procedimiento de dos pasos. Después de obtener los datos en la memoria Flash, que requiere métodos especiales (funciones), también definidas en la biblioteca pgmspace.h leemos de nuevo los datos de la memoria de programa en SRAM, por lo que podemos hacer algo útil con él.
Sintaxis
const dataType variableName[] PROGMEM = {data0, data1, data3...};
Parámetros
- dataType: cualquier tipo de variable
- variableName: el nombre de nuesto dato o matriz
※ Nota:
Tenga en cuenta que debido a que PROGMEM es un modificador de la variable, no hay ninguna regla dura y rápida acerca de donde debe ir, por lo que el compilador de Arduino acepta todas las definiciones de más abajo, que también son sinónimos. Sin embargo los experimentos han indicado que, en varias versiones de Arduino (que tienen que ver con la versión de GCC), PROGMEM puede trabajar en un lugar y no en otro. El ejemplo "tabla de cadenas" siguiente ha sido probado para trabajar con Arduino 13. Las versiones anteriores del IDE pueden funcionar mejor si se incluye PROGMEM después del el nombre de la variable.
Ejemplo
El siguiente fragmento de código ilustra como podemos leer y escribir caracteres (bytes) e ints (2 bytes) en PROGMEM.
Matriz de cadenas
A menudo es conveniente cuando se trabaja con grandes cantidades de texto, como un proyecto con una pantalla LCD, configurar una matriz de cadenas. Debido a que las cadenas en sí son arrays, esto es en realidad un ejemplo de una matriz de dos dimensiones.
Estas tienden a ser grandes estructuras para su puesta en memoria de programa que a menudo es deseable. El código siguiente ilustra la idea.
※ Nota:
Tenga en cuenta que las variables deben definirse como globales, o definidas con la palabra clave static, para poder trabajar con PROGMEM.
- El siguiente código no trabajará dentro de una función:
- El siguiente código funciona, incluso si está definido a nivel local dentro de una función:
La macro F()
Cuando una instrucción similar a esta:
se utiliza, la cadena que se va a imprimir se guarda normalmente en la memoria RAM. Si el sketch imprime un montón de cosas en el monitor serie, puede llenar fácilmente la memoria RAM. Si tenemos espacio libre en la memoria FLASH, fácilmente podemos indicar que la cadena debe estar guardada en flash utilizando la sintaxis:
※ ARDUINO BUY RECOMMENDATION
Arduino UNO R3 | |
Arduino Starter Kit |