Main

Référence : Langage Arduino : [ Mini | Standard | Etendue | Maxi ] Librairies : [ Vue d'ensemble | Synthèse ] Infos : [ Comparaison | Changements ]

PROGMEM


Description

Stocke les données dans la mémoire Flash (mémoire programme) au lieu de la mémoire SRAM. Il y a ici une description des différents types de données disponibles sur une carte Arduino.

Remarque : Les données ainsi stockée en mémoire Flash ne seront accessibles que en lecture. Pour un stockage de données non-volatiles, utiliser la librairie EEPROM.

Le mot-clé PROGMEM est un modificateur de variable, et pourra être utilisé avec les types de données définis dans la librairie pgmspace.h. Il indique au compilateur de mettre les données dans la mémoire FLASH", au lieu de la SRAM, où elles devraient normalement aller.

PROGMEM est une partie de la librairie pgmspace.h. Donc, vous devez avant tout inclure cette librairie au début de votre programme, de la façon suivante :

#include <avr/pgmspace.h>

Syntaxe

dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...}; 

Paramètres

  • dataType : n'importe quel type de variable de mémoire programme (voir ci-dessous)
  • variableName : le nom de votre tableau de données
  • dataInt0, dataInt1, ... : vos données à mettre en mémoire FLASH

Remarques

Noter que puisque PROGMEM est un modificateur de variable, il n'y a pas de règle obligatoire quant à son emplacement, et le compilateur Arduino accepte toutes les définitions ci-dessous comme équivalentes. Cependant l'expérience à montré que, dans les différentes versions d'Arduino (basées sur des versions de GCC), PROGMEM peut fonctionner dans une position et pas dans une autre. Le tableau "chaîne de caractère" ci-dessous a été testé avec Arduino 13. Dans les versions précédentes du logiciel Arduino, cela peut ne pas fonctionner si PROGMEM est positionné après le nom de la variable.


dataType variableName[] PROGMEM = {};   // utiliser cette façon
PROGMEM  dataType  variableName[] = {}; // ou cette façon
dataType PROGMEM variableName[] = {};   // pas cette façon

Bien que PROGMEM peut-être utilisé avec une variable unitaire, il vaut la peine d'être utilisé seulement si vous avez un grand bloc de données à stocker (car la SRAM est limitée), et donc la meilleure façon est d'utiliser un tableau, (ou une autre structure de données C, hors de notre propos ici).

Comme mentionné ci-dessu, c'est important d'utilisé des types de données présents dans pgmspace.h. Quelques erreurs énigmatiques sont produits par l'utilisation de type de données ordinaires pour les appels de mémoire programme. Ci-dessous, voici la liste des types de variables à utiliser. Les nombres en virgule flottante ne sont pas supportés semblent-il.


prog_char      : un char signé (1 octet) -127 à 128
prog_uchar     : un char non signé (2 octets) 0 à 255
prog_int16_t   : un int signé (2 octets) -32,767 à 32,768
prog_uint16_t  : un int non signé (2 octets) 0 à 65,535
prog_int32_t   : un long signé (4 octets) -2,147,483,648 à  2,147,483,647.
prog_uint32_t  : un long non-signé (4 octets) 0 à 4,294,967,295

Exemple

1er exemple

Les extraits de code suivants illustre comment lire et écrire des variables de type char non signé (octets) et de type int (2 octets) avec PROGMEM.


#include <avr/pgmspace.h>


// stocker en mémoire FLASH des int non signés
PROGMEM  prog_uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};

// stocker en mémoire FLASH des char non signés
prog_uchar signMessage[] PROGMEM  = {"I AM PREDATOR,  UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};

unsigned int displayInt;
int k;    // variable de comptage
char myChar;  

// Lecture d'un int
 displayInt = pgm_read_word_near(charSet + k)

// lecture d'un octet 
myChar =  pgm_read_byte_near(signMessage + k); 

Tableau de chaînes de caractères

Il est souvent plus pratique lorsque l'on travaille avec de grande quantité de texte, tel qu'un projet utilisant un afficheur LCD, de déclarer un tableau de chaines de caractères. Puisque les chaînes de caractères sont elles-mêmes des tableaux, voici un exemple de tableau à 2 dimensions.

Ces tableaux ont tendance à être de grandes structures, et par conséquent les mettre dans la mémoire FLASH (mémoire programme) est le plus souvent souhaitable. Le code ci-dessous illustre cette idée.


/*
 PROGMEM démo avec chaines de caractères
Comment stocker un tableau de caractère dans la mémoire FLASH programme
et les utiliser dans un programme.

Informations résumées depuis :
http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

Définir un tableau de chaines de caractères dans la mémoire programme est légèrement compliqué, 
mais voici un bon exemple à suivre. 

La défintion d'un tableau de chaînes de caractère est un processus à 2 temps. 
Tout d'abord définir les chaînes de caractère.

*/

#include <avr/pgmspace.h>
prog_char string_0[] PROGMEM = "String 0";   // "String 0" etc.. sont les chaînes de caractères.
prog_char string_1[] PROGMEM = "String 1";
prog_char string_2[] PROGMEM = "String 2";
prog_char string_3[] PROGMEM = "String 3";
prog_char string_4[] PROGMEM = "String 4";
prog_char string_5[] PROGMEM = "String 5";


// A présent, définir un tableau pour accéder aux chaînes

PROGMEM const char *string_table[] = 	   //création d'un tableau appelé string_table
{   
  string_0,
  string_1,
  string_2,
  string_3,
  string_4,
  string_5 };

char buffer[30];    // Etre sûr que la largeur est suffisante pour la plus grande chaîne à stocker. 

void setup()			  
{
  Serial.begin(9600);
}


void loop()			  
{

/* 

L'utilisation du tableau placé en mémoire FLASH nécessite l'utilisation de fonctions spéciales pour retrouver les données. 
La fonction strcpy_P copie une chaîne depuis la mémoire FLASH dans la chaîne "buffer" de la mémoire RAM.
Etre sûr que la largeur est suffisante pour la plus grande chaîne à lire en mémoire FLASH. 

  for (int i = 0; i < 6; i++)
  {
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Copie la chaîne - ici la ligne "clé" du programme
    Serial.println( buffer ); // affiche la chaîne
    delay( 500 );
  }
}

Voir également :

Commentaires utilisateurs

Aucun commentaire


Page d'accueil de la référence Arduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées sur le Forum Arduino ou à l'adresse suivante : support_at_mon-club-elec_point_fr

Le texte original de la référence Arduino est sous licence Creative Commons Attribution-ShareAlike 3.0 . Les exemples de code dans la référence sont dans le domaine public.

La présente traduction française commentée a été réalisée par Xavier HINAULT (2010-2012) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0.

Traduction de la page originale : http://www.arduino.cc/en/Reference/PROGMEM