Actualmente estoy cambiando algunas bibliotecas para usar flash en lugar de RAM para el almacenamiento de cadenas para que no me quede sin SRAM en un proyecto.
Algunas cadenas de la biblioteca se declaran de esta manera:
const char *testStringA = "ABC";
Esto es diferente a cómo normalmente veo esto hecho:
const char testStringB[] = "DEF";
Sin embargo, creo que estos dos son equivalentes cuando se declaran constantes e inicializados en la declaración. Ambos funcionan bien en código.
Intenté mover estos a flash:
const prog_char *testStringC PROGMEM = "GHI";
Entonces descubrí que esto no funcionaba. Producía gobbledegook cuando se imprimía.
Sin embargo, siguiendo el patrón más habitual de:
const prog_char testStringD[] PROGMEM = "JKL";
funciona bien.
Puedo ver en el desmontaje:
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
Por lo tanto, queda claro el puntero y PROGMEM da como resultado que la cadena / matriz no se inicialice.
¿Por qué es esto?
Código de ejemplo:
#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);
}