Зараз я змінюю деякі бібліотеки, щоб використовувати флеш замість оперативної пам’яті для зберігання рядків, щоб у мене не було проекту SRAM.
Деякі рядки в бібліотеці оголошені таким чином:
const char *testStringA = "ABC";
Це відрізняється від того, як я зазвичай вважаю це зробленим:
const char testStringB[] = "DEF";
Однак я думаю, що ці два рівні, коли вони оголошені const та ініціалізовані в декларації. Обидва добре працюють у коді.
Я намагався перемістити їх у спалах:
const prog_char *testStringC PROGMEM = "GHI";
Потім я виявив, що це не працює. Під час друку він виготовляв гусячий кулик.
Однак, дотримуючись більш звичного шаблону:
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);
}