No momento, estou alterando algumas bibliotecas para usar flash em vez de RAM para armazenamento de string, para que eu não fique sem SRAM em um projeto.
Algumas seqüências de caracteres na biblioteca são declaradas desta maneira:
const char *testStringA = "ABC";
Isso é diferente de como eu normalmente vejo isso sendo feito:
const char testStringB[] = "DEF";
No entanto, acho que esses dois são equivalentes quando declarados const e inicializados na declaração. Ambos funcionam bem no código.
Tentei movê-los para piscar:
const prog_char *testStringC PROGMEM = "GHI";
Eu então descobri que isso não funcionou. Ele estava produzindo um gobbledegook quando impresso.
No entanto, seguindo o padrão mais usual de:
const prog_char testStringD[] PROGMEM = "JKL";
funciona bem.
Eu posso ver na desmontagem:
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
Portanto, fica claro que o ponteiro e PROGMEM resultam na seqüência / matriz não sendo inicializada.
Por que é isso?
Código de exemplo:
#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);
}