В настоящее время я изменяю некоторые библиотеки, чтобы использовать флэш-память вместо ОЗУ для хранения строк, чтобы в проекте не заканчивалась 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);
}
PSTR()
макрос, ноF()
перед отправкой изменил его , потому что ваши константы являются глобальными в вашем Q, поэтому я предпочел придерживаться того, который должен работать в обоих контекстах.Что это за линия:
делает, чтобы написать код пролога, чтобы скопировать символы в строке в SRAM, а затем инициализирует указатель, сохраненный во флэш-памяти, в это местоположение SRAM. Вы должны загрузить указатель обычным способом, а затем разыменовать указатель как обычно.
Эта строка:
создает массив символов во флэш-памяти, позволяя вам получить к нему доступ, как и ожидалось.
источник