Je modifie actuellement certaines bibliothèques pour utiliser flash au lieu de RAM pour le stockage de chaînes afin de ne pas manquer de SRAM sur un projet.
Certaines chaînes de la bibliothèque sont déclarées de cette manière:
const char *testStringA = "ABC";
Ceci est différent de la façon dont je vois normalement cela:
const char testStringB[] = "DEF";
Cependant, je pense que ces deux sont équivalents lorsqu'ils sont déclarés const et initialisés dans la déclaration. Les deux fonctionnent bien dans le code.
J'ai essayé de les déplacer pour flasher:
const prog_char *testStringC PROGMEM = "GHI";
J'ai alors constaté que cela ne fonctionnait pas. Il produisait du charabia lors de l'impression.
Cependant, suivant le schéma le plus habituel de:
const prog_char testStringD[] PROGMEM = "JKL";
fonctionne bien.
Je peux voir dans le démontage:
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
Il est donc clair que le pointeur et PROGMEM entraînent l'initialisation de la chaîne / du tableau.
Pourquoi est-ce?
Exemple de code:
#include <avr/pgmspace.h>
const int BUFFER_LEN = 20;
const char *testStringA = "ABC";
const char testStringB[] = "DEF";
const prog_char *testStringC PROGMEM = "GHI";
const prog_char testStringD[] PROGMEM = "JKL";
void setup()
{
Serial.begin(9600);
}
void loop()
{
char buffer[BUFFER_LEN];
Serial.println(testStringA);
Serial.println(testStringB);
strncpy_P(buffer, testStringC, BUFFER_LEN);
Serial.println(buffer);
strncpy_P(buffer, testStringD, BUFFER_LEN);
Serial.println(buffer);
delay(1000);
}