Mémoire disponible faible

Bonjour à tous !

Mon programme s'étoffant, je me retrouve avec ce message :
"Le croquis utilise 17654 octets (57%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.
Les variables globales utilisent 1694 octets (82%) de mémoire dynamique, ce qui laisse 354 octets pour les variables locales. Le maximum est de 2048 octets.
La mémoire disponible faible, des problèmes de stabilité pourraient survenir."

Bien entendu, j'ai fait le tri et les variables ne nécessitant pas d'être globales ont été transférées dans leurs fonctions respectives. Je ne peux pas en transférer plus.

Dans les variables globales, sont également déclarés 10 messages pour le LCD tels que celui-ci :

char* standByScreen_Msgs [] = {
  "EN ATTENTE          ", 
  "- Entrees inactives ",
  "- Sorties inactives ",
  "                    ",
};

J'ai transféré chacun de ces messages dans leurs fonctions spécifiques ; elles sont donc devenues des variables locales.

Je pensais réduire d'autant la volume des variables globales, mais leur volume reste identique que ces 10 messages soient déclarés comme variables globales ou comme variables locales (dans leurs fonctions respectives).

Qui pourrait m'en expliquer la raison ?

Merci par avance.

Il faudrait te renseigner sur PROGMEN, en particulier la macro F() :
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

La question peut être que ferais-je si je devais écrire le compilateur. Il y a une chaine locale qui donc doit être initialisée après l'appel de la fonction. Il faut donc que la chaîne qui permette l'initialisation soit rangée quelque part. Une solution que je vois est de la mettre en variable globale inaccessible et d'en faire une copie locale à l'exécution de la fonction. On a alors deux fois plus de place utilisée. Ce n'est pas génial.

On peut aussi faire, si la variable n'est pas modifiée, la définir comme une fonction locale mais du type static. C'est une variable qui ressemble à une variable locale mais qui est en réalité globale. Du coup cela pourrait ne pas changer la taille des variables.

Si un programme a 1000 octets de variables globales et 0 variables locales, en passant 500 octets de variables globales en locales, le compilateur ne va plus rien dire, mais l'espace occupé peut être le même. On y gagne en taille que si les fonctions n'utilisent pas toutes les variables.

Quand se fait sentir le manque de place, on peut, comme le suggère Henri, utiliser la macro F(), et on trouve bien souvent des variables intermédiaires que l'on peut supprimer, par exemple:

etatBouton = digitalRead(bouton);
if (etatBouton == HIGH) ....

qui peut s'écrire:

if (digitalRead(bouton) == HIGH) ....

Et qui peut faire économiser un octet (même deux si on a pris l'habitude de définir les etatBouton par un int).

@hbachetti
Je ne connaissais cette macro ; je vais étudier ça !

@vileroi
J'ai déjà optimisé toutes les variables.
Il me reste la suggestion de hbachetti ... ou à utiliser une carte Mega.

Merci pour votre aide.

Si tu le dis...

Supprimer des variables non indispensables est à la porté d'un programmeur averti, connaitre et utiliser F() est à la porté d'un programmeur pas débutant mais presque. Il y a pour moi une contradiction.