Ardu? No!Initiation ≫ La macro F( )

La macro F( )

Revenons sur le programme "blink with delay". En rajoutant un affichage qui donne le temps pendant lequel la led est allumée, on a:

void setup() {
  Serial.begin(115200); // Pour indiquer le temps
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  Serial.println("La led est allumée pendant 0,5s");

  digitalWrite(LED_BUILTIN, HIGH);
  delay(500); // Led allumée pendant 0,5s
  digitalWrite(LED_BUILTIN, LOW);
  delay(500); // Led éteinte pendant 0,5s
}

Quand on fait marcher ce programme, 2 leds clignotent: celle qui nous intéresse (LED_BUILTIN) et la led informant l'envoi du texte sur la console (par Serial.println( ). On peut une fois que l'on a compris le fonctionnement ne plus exécuter cette ligne. Le mieux est de la mettre sous commentaire en mettent // devant. Ainsi, on pourra remettre l'affichage plus tard si on en a besoin.

Mais ici, nous allons d'abord légèrement modifier l'affichage par Serial.println. Nous allons utiliser la syntaxe suivante:

Serial.println(F("La led est allumée pendant 0,5s"));

En faisant cela, au lieu d'afficher la chaîne, vous passez la chaîne à une fonction F( ) et vous allez affichez ce que retourne la fonction. Si vous essayez, il n'y aura pas de différences, sauf que l'occupation mémoire à changée. En compilant sur Uno le programme précédent, on a le message:

Le croquis utilise 1986 octets (6%) de l'espace de
stockage de programmes. Le maximum est de 32256 octets.

Les variables globales utilisent 220 octets (10%) de 
mémoire dynamique, ce qui laisse 1828 octets pour les
variables locales. Le maximum est de 2048 octets.

En rajoutant la fonction F (certains disent la macro, car la fonction est définie à l'aide d'une macro, mais pour l'instant, on n'a pas encore parlé de ce qu'est une macro) le message de la compilation va être:

Le croquis utilise 2000 octets (6%) de l'espace de
stockage de programmes. Le maximum est de 32256 octets.

Les variables globales utilisent 188 octets (9%) de
mémoire dynamique, ce qui laisse 1860 octets pour les
variables locales. Le maximum est de 2048 octets.

On observera que l'espace de stockage du programme a augmenté de 34 octets et que l'espace de stockage des données (variables globales) a diminué de 32 octets. Ces 32 octets sont ceux de la chaîne "La led est allumée pendant 0,5s" qui comprend 31 caractères dont une lettre accentuée qui occupe deux octets. La macro F permet donc de transférer les chaînes constantes d'un espace sur l'autre.

Quand le programme est petit, cela n'a pas d'importance, mais on observe que c'est l'espace des données qui va le plus souvent limiter le programme que l'on souhaite faire. On va donc prendre l'habitude dès maintenant de mettre systématiquement la macro même si c'est inutile, en prévision de l'avenir.