fonctionnement de PROGMEM

Bonjour,

je tente d’économiser de la mémoire sur un UNO ou NANO, même quantité
quand je met ce code :

const char test PROGMEM = {“123456789012345678901234567890”};
Serial.print(test);

je n’ai aucune économie de mémoire par rapport a :

const char test = {“123456789012345678901234567890”};
Serial.print(test);

comme si le PROGMEM ne servait a rien ??

par contre si je place ma chaine avec un F(), la j’ai bien une économie de mémoire mais ma chaine ne correspond plus a rien et me donne :
ps����|�

je ne peux donc pas utiliser le F() et le PROGMEM ne fonctionne pas,
quelle est la bonne méthode, j’ai cherché un peu partout sur internet mais je trouve rien pour mon cas …???

pour info, j’ai bien mis le avr/pgmspace.h au début !!

il faut juste relire la doc pour voir l'accès et la déclaration :slight_smile:

la macro F() fait le boulot pour vous si ce que vous voulez c'est juste gérer du texte dans les fonctions qui le supportent (genre Print)

Bonjour

eh bien non justement, ça ne change rien de mettre ou non PROGMEM dans ma ligne !

je suis en ide 1.8.1 sur un MAC

avec :

#include <Flash.h>
#include <avr/pgmspace.h>


void setup() {
 // put your setup code here, to run once:

const char test[] = {"123456789012345678901234567890"};
Serial.print(test);

}

void loop() {
 // put your main code here, to run repeatedly:

}

Le croquis utilise 1382 octets (4%) de l’espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 214 octets (10%) de mémoire dynamique, ce qui laisse 1834 octets pour les variables locales. Le maximum est de 2048 octets.

avec (PROGMEM en plus :

#include <Flash.h>
#include <avr/pgmspace.h>


void setup() {
 // put your setup code here, to run once:

const char test[] PROGMEM = {"123456789012345678901234567890"};
Serial.print(test);

}

void loop() {
 // put your main code here, to run repeatedly:

}

Le croquis utilise 1382 octets (4%) de l’espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 214 octets (10%) de mémoire dynamique, ce qui laisse 1834 octets pour les variables locales. Le maximum est de 2048 octets.

ALORS QUE :

#include <Flash.h>
#include <avr/pgmspace.h>


void setup() {
  // put your setup code here, to run once:
/*
const char test[] PROGMEM = {"123456789012345678901234567890"};
Serial.print(test);
*/
Serial.print(F("123456789012345678901234567890"));


}

void loop() {
  // put your main code here, to run repeatedly:

}

Le croquis utilise 1354 octets (4%) de l’espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 182 octets (8%) de mémoire dynamique, ce qui laisse 1866 octets pour les variables locales. Le maximum est de 2048 octets.

voilà bien mes 32 octets de gagné avec le F()
et mon PROGMEM qui n’a pas fonctionné…

je ne dois pas être loin de la solution mais je ne vois pas trop…

Bonjour,

test est défini comme une variable automatique dans setup(), ceci doit prendre le pas sur la déclaration PROGMEM

Il faut soit

  • définir test en dehors de toute fonction
  • soit le déclarer comme static const

GENIAL

c'est exactement ce qu'il me manquait - le mot static me met bien en mémoire flash et j'ai bien mon économie de mémoire avec PROGMEM !!

allé, maintenant plus compliqué ...
mes jours de semaine sont dans un tableau du genre :

const char *joursem = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};

la je ne peux pas utiliser F() ça marche pas,
si je met PROGMEM avec ou sans static j'ai un message d'erreur

si je change pour corriger mon message d'erreur en :
static const char joursem[7][10] PROGMEM = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};

je n'ai plus d'erreur de compilation mais mes chaines ne sont plus bonnes, j'ai des séries de chiffres qui s'affichent a la place de mes jours de semaine...

Pour un tableau de chaînes, cf mon post #1. Il y a un exemple dans la doc