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);
}
PSTR()
macro, pero cambié aF()
antes de enviarla, porque tus consts son globales en tu Q, por lo que preferí seguir con la que debería funcionar en ambos contextos.Qué es esta línea:
lo que hace es escribir el código de prólogo para copiar los caracteres en la cadena a SRAM, y luego inicializa el puntero almacenado en flash en esta ubicación SRAM. Debe cargar el puntero por medios normales y luego desreferenciar el puntero como de costumbre.
Esta línea:
crea el conjunto de caracteres en flash, lo que le permite acceder a él como se esperaba.
fuente