Attualmente sto cambiando alcune librerie per usare flash invece di RAM per l'archiviazione di stringhe in modo da non rimanere senza SRAM su un progetto.
Alcune stringhe nella libreria sono dichiarate in questo modo:
const char *testStringA = "ABC";
Questo è diverso da come normalmente vedo questo fatto:
const char testStringB[] = "DEF";
Tuttavia, penso che questi due siano equivalenti quando dichiarati const e inizializzati nella dichiarazione. Entrambi funzionano bene nel codice.
Ho provato a spostare questi per lampeggiare:
const prog_char *testStringC PROGMEM = "GHI";
Ho quindi scoperto che questo non ha funzionato. Stava producendo gobbledegook quando stampato.
Tuttavia, seguendo il modello più comune di:
const prog_char testStringD[] PROGMEM = "JKL";
funziona bene.
Riesco a vedere nello smontaggio:
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
Quindi è chiaro che il puntatore e PROGMEM danno come risultato l'inizializzazione della stringa / matrice.
Perchè è questo?
Codice di esempio:
#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);
}