Description :
Stockez les données dans la mémoire flash (programme) au lieu de la SRAM. Il y a une description des différents types de mémoire disponibles sur une carte Arduino.
Le PROGMEM
mot-clé est un modificateur de variable, il ne doit être utilisé qu’avec les types de données définis dans pgmspace.h. Il dit au compilateur de « mettre ces informations dans la mémoire flash », au lieu de la SRAM, où elles devraient normalement aller.
PROGMEM fait partie de la bibliothèque pgmspace.h . Il est inclus automatiquement dans les versions modernes de l’IDE. Cependant, si vous utilisez une version IDE inférieure à 1.0 (2011), vous devrez d’abord inclure la bibliothèque en haut de votre sketch, comme ceci :
#include <avr/pgmspace.h>
Bien qu’il puisse PROGMEM
être utilisé sur une seule variable, cela ne vaut vraiment la peine que si vous avez un bloc de données plus volumineux à stocker, ce qui est généralement le plus simple dans un tableau (ou une autre structure de données C++ au-delà de notre discussion actuelle).
L’utilisation PROGMEM
est également une procédure en deux étapes. Après avoir placé les données dans la mémoire Flash, des méthodes (fonctions) spéciales, également définies dans la bibliothèque pgmspace.h , sont nécessaires pour lire les données de la mémoire du programme dans la SRAM, afin que nous puissions en faire quelque chose d’utile.
Syntaxe :
const dataType variableName[] PROGMEM = {data0, data1, data3…};
Notez que parce que PROGMEM est un modificateur de variable, il n’y a pas de règle absolue sur l’endroit où il doit aller, donc le compilateur Arduino accepte toutes les définitions ci-dessous, qui sont également synonymes. Cependant, des expériences ont indiqué que, dans diverses versions d’Arduino (liées à la version GCC), PROGMEM peut fonctionner à un endroit et pas à un autre. L’exemple de « table de chaînes » ci-dessous a été testé pour fonctionner avec Arduino 13. Les versions antérieures de l’IDE peuvent mieux fonctionner si PROGMEM est inclus après le nom de la variable.
const dataType variableName[] PROGMEM = {}; //utiliser ce formulaire
const PROGMEM dataType variableName[] = {}; //ou celui-ci
const dataType PROGMEM variableName[] = {}; // pas celui-ci
Paramètres :
dataType
: Types de données autorisés : tout type de variable.
variableName
: le nom de votre tableau de données.
Exemple de code :
Les fragments de code suivants illustrent comment lire et écrire des caractères non signés (octets) et des entiers (2 octets) dans PROGMEM.
Arrays of strings
Il est souvent pratique, lorsque vous travaillez avec de grandes quantités de texte, comme un projet avec un écran LCD, de configurer un tableau de chaînes. Étant donné que les chaînes elles-mêmes sont des tableaux, il s’agit en fait d’un exemple de tableau à deux dimensions.
Ceux-ci ont tendance à être de grandes structures, il est donc souvent souhaitable de les mettre dans la mémoire du programme. Le code ci-dessous illustre l’idée.
Remarques et avertissements :
Veuillez noter que les variables doivent être soit définies globalement, soit définies avec le mot-clé static, afin de fonctionner avec PROGMEM.
Le code suivant ne fonctionnera PAS à l’intérieur d’une fonction :
const char long_str[] PROGMEM = "Bonjour, je voudrais vous parler un peu de moi.\n";
Le code suivant fonctionnera, même s’il est défini localement dans une fonction :
const static char long_str[] PROGMEM = "Bonjour, je voudrais vous parler un peu de moi.\n"
La F()
macro :
Quand une instruction comme :
Serial.print("Écrire quelque chose sur le moniteur série");
est utilisé, la chaîne à imprimer est normalement enregistrée dans la RAM. Si votre croquis imprime beaucoup de choses sur le moniteur série, vous pouvez facilement remplir la RAM. Si vous avez de l’espace mémoire FLASH libre, vous pouvez facilement indiquer que la chaîne doit être sauvegardée en FLASH en utilisant la syntaxe :
Serial.print(F("Écrivez quelque chose sur le moniteur série qui est stocké dans FLASH"));
Source : https://www.arduino.cc/reference/en/language/variables/utilities/progmem/