Diferencia entre revisiones de «PROGMEM»
(→Ejemplo 2) |
(→Vea también) |
||
(No se muestran 8 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
== Descripción == | == Descripción == | ||
− | Almacena datos en la memoria [[flash]] (memoria de programa) en lugar de la [[ | + | Almacena datos en la memoria [[flash]] (memoria de programa) en lugar de la [[SRAM]]. |
− | La palabra clave '''PROGMEM''' es un | + | La palabra clave '''PROGMEM''' es un modificador 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. |
+ | == Sintaxis == | ||
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: | 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: | ||
<pre> | <pre> | ||
#include <avr/pgmspace.h> | #include <avr/pgmspace.h> | ||
− | |||
− | |||
− | |||
− | |||
const tipo variable[] PROGMEM = {}; //usar este formato | const tipo variable[] PROGMEM = {}; //usar este formato | ||
const PROGMEM tipo variable[] = {}; //o este formato | const PROGMEM tipo variable[] = {}; //o este formato | ||
Línea 27: | Línea 24: | ||
== Ejemplo 1 == | == Ejemplo 1 == | ||
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. | 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. | ||
− | < | + | |
+ | <syntaxhighlight lang="c++"> | ||
#include <avr/pgmspace.h> | #include <avr/pgmspace.h> | ||
const PROGMEM uint16_t charSet[] = {65000, 32796, 16843, 10, 11234}; | const PROGMEM uint16_t charSet[] = {65000, 32796, 16843, 10, 11234}; | ||
Línea 54: | Línea 52: | ||
//Nada. | //Nada. | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
== Vea también == | == Vea también == | ||
+ | * [[variable publica]] | ||
+ | * [[variable local]] | ||
+ | * [[matriz]] | ||
+ | * [[define|#define]] | ||
+ | * [[static]] | ||
+ | * [[volatile]] | ||
+ | * [[const]] | ||
+ | * [[Palabras reservadas]] | ||
== Referencias == | == Referencias == | ||
[[Category:Variables]] | [[Category:Variables]] |
Revisión actual del 05:19 2 feb 2020
Contenido
Descripción
Almacena datos en la memoria flash (memoria de programa) en lugar de la SRAM.
La palabra clave PROGMEM es un modificador 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.
Sintaxis
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> const tipo variable[] PROGMEM = {}; //usar este formato const PROGMEM tipo variable[] = {}; //o este formato const tipo PROGMEM variable[] = {}; //NO usar este formato
Parámetros
- variable
- el nombre de nuesta dato o matriz
- tipo
- cualquier tipo de variable byte, int, long, float, etc
Advertencias
- 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.
- 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.
Ejemplo 1
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.
#include <avr/pgmspace.h>
const PROGMEM uint16_t charSet[] = {65000, 32796, 16843, 10, 11234};
const char signMessage[] PROGMEM = {"YO SOY PREDATOR, COMBATIENTE INVISIBLE. CREADO POR EL DEPARTAMENTO DE LOS ESTADOS UNIDOS"};
unsigned int displayInt;
char myChar;
void setup() {
Serial.begin(115200);
while (!Serial);
//lee de nuevo un int de 2 bytes
for (int k=0; k<5; k++) {
displayInt = pgm_read_word_near(charSet + k);
Serial.println(displayInt);
}
Serial.println();
//lee de nuevo un caracter
int len = strlen_P(signMessage);
for (int k=0; k<len; k++){
myChar = pgm_read_byte_near(signMessage + k);
Serial.print(myChar);
}
Serial.println();
}
void loop(){
//Nada.
}