Diferencia entre revisiones de «PROGMEM»

De ArduWiki
Saltar a: navegación, buscar
(Vea también)
(Ejemplo 1)
Línea 27: Línea 27:
 
== 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.
<pre>
+
 
 +
<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 55:
 
   //Nada.
 
   //Nada.
 
}
 
}
</pre>
+
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==

Revisión del 20:10 5 jul 2018

Descripción

Almacena datos en la memoria flash (memoria de programa) en lugar de la RAM.

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 RAM, 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>

Sintaxis

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.
}

Vea también

Referencias