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);
}
PSTR()
macro mais je l'ai changéF()
avant de le soumettre, car vos consts sont globales dans votre Q, j'ai donc préféré m'en tenir à celle qui devrait fonctionner dans les deux contextes.Qu'est-ce que cette ligne:
ne consiste à écrire du code de prologue pour copier les caractères de la chaîne dans SRAM, puis initialise le pointeur stocké en flash sur cet emplacement SRAM. Vous devez charger le pointeur par des moyens normaux, puis déréférencer le pointeur comme d'habitude.
Cette ligne:
crée le tableau de caractères en flash, vous permettant d'y accéder comme prévu.
la source