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);
}
PSTR()
makro dulu tetapi berubahF()
sebelum mengirimkan, karena konstanta Anda adalah global dalam Q Anda, jadi saya lebih suka tetap dengan yang harus bekerja di kedua konteks.Apa baris ini:
Yang dilakukan adalah menulis kode prolog untuk menyalin karakter dalam string ke SRAM, dan kemudian menginisialisasi pointer yang tersimpan dalam flash ke lokasi SRAM ini. Anda harus memuat pointer melalui cara normal, dan kemudian melakukan dereferensi pointer seperti biasa.
Garis ini:
menciptakan array karakter dalam flash, memungkinkan Anda untuk mengaksesnya seperti yang diharapkan.
sumber