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);
}
PSTR()
macro, mas mudei paraF()
antes de enviar, porque seus consts são globais no seu Q, então eu preferi ficar com o que deveria funcionar nos dois contextos.O que esta linha:
faz é escrever um código de prólogo para copiar os caracteres na sequência para SRAM e, em seguida, inicializa o ponteiro armazenado no flash para esse local da SRAM. Você deve carregar o ponteiro por meios normais e, em seguida, desreferenciar o ponteiro como de costume.
Está linha:
cria a matriz de caracteres em flash, permitindo o acesso conforme o esperado.
fonte