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

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> const char string_0[] PROGMEM = "String 0"; // "String 0" etc are strings to store - change to suit. const char string_1[] PROGMEM = "String 1"; const char string_2[] PROGMEM = "String 2"; const char string_3[] PROGMEM = "String 3"; const char string_4[] PROGMEM = "String 4"; const char string_5[] PROGMEM = "String 5"; // Then set up a table to refer to your strings. const char *const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5}; char buffer[30]; // make sure this is large enough for the largest string it must hold void setup() { Serial.begin(9600); while (!Serial); // wait for serial port to connect. Needed for native USB Serial.println("OK"); } 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]))); // Necessary casts and dereferencing, just copy. Serial.println(buffer); delay(500); } }

※ Remarque:

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

ARDUINO BUY RECOMMENDATION

Arduino UNO R3
Arduino Starter Kit
Please note: These are Amazon affiliate links. If you buy the components through these links, We will get a commission at no extra cost to you. We appreciate it.

※ OUR MESSAGES