Saya saat ini mengubah beberapa perpustakaan untuk menggunakan flash, bukan RAM untuk penyimpanan string sehingga saya tidak kehabisan SRAM pada proyek.
Beberapa string di perpustakaan dinyatakan dengan cara ini:
const char *testStringA = "ABC";
Ini berbeda dengan bagaimana saya biasanya melihat ini dilakukan:
const char testStringB[] = "DEF";
Namun, saya berpikir bahwa keduanya setara ketika dinyatakan const dan diinisialisasi dalam deklarasi. Keduanya bekerja dengan baik dalam kode.
Saya mencoba memindahkan ini ke flash:
const prog_char *testStringC PROGMEM = "GHI";
Saya kemudian menemukan bahwa ini tidak berhasil. Itu menghasilkan kue gobbled ketika dicetak.
Namun, mengikuti pola yang lebih umum:
const prog_char testStringD[] PROGMEM = "JKL";
bekerja dengan baik.
Saya bisa melihat di pembongkaran:
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
Jadi jelas pointer dan hasil PROGMEM di string / array tidak diinisialisasi.
Kenapa ini?
Kode contoh:
#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);
}