ขณะนี้ฉันกำลังเปลี่ยนห้องสมุดบางแห่งให้ใช้แฟลชแทน RAM สำหรับการจัดเก็บสตริงเพื่อที่ฉันจะไม่หมด SRAM ในโครงการ
สตริงบางตัวในไลบรารีถูกประกาศในลักษณะนี้:
const char *testStringA = "ABC";
สิ่งนี้ต่างจากวิธีที่ฉันเห็นสิ่งนี้ตามปกติ:
const char testStringB[] = "DEF";
อย่างไรก็ตามฉันคิดว่าทั้งสองนี้เท่ากันเมื่อประกาศ const และเริ่มต้นในการประกาศ ทำงานได้ดีทั้งในรหัส
ฉันพยายามย้ายสิ่งเหล่านี้ไปยังแฟลช:
const prog_char *testStringC PROGMEM = "GHI";
ฉันพบว่ามันใช้งานไม่ได้ มันกำลังผลิต gobbledegook เมื่อพิมพ์
อย่างไรก็ตามทำตามรูปแบบปกติของ:
const prog_char testStringD[] PROGMEM = "JKL";
ทำงานได้ดี
ฉันสามารถดูได้ในการถอด:
00000068 <testStringC>:
68: 04 01 ..
0000006a <_ZL11testStringD>:
6a: 4a 4b 4c 00 JKL.
ดังนั้นจึงเป็นตัวชี้ชัดเจนและผลลัพธ์ PROGMEM ในสตริง / อาร์เรย์ไม่ได้เริ่มต้น
ทำไมนี้
รหัสตัวอย่าง:
#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);
}