Оперативная память ценный ресурс, а Flash память программ не часто используется на 100%. Строковые литералы засоряют оперативную память даже если они используются для объявления переменных и констант локально.
Строковые литералы можно хранить в Flash памяти. На плате Arduino UNO, NANO и им подобных установлен микроконтроллер ATmega328 / P. М-к ATmega328 содержит 32 Кбайт Flash-памяти программ, 1 Кбайт энергонезависимой памяти (EEPROM), 2 Кбайт оперативной памяти (SRAM).
Пример, сохраняем строку вFlash памяти и восстанавливаем в строковый массив:
PROGMEM const char msgSendRemoteXY[] = "Подключите смартфон к Wi-Fi RemoteXY, запустите APP RemoteXY.";
PROGMEM const char msgSSIDpwd[] = "В приложении RemoteXY введите SSID и пароль вашей Wi-Fi сети.";
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
printMsg(msgSendRemoteXY);
printMsg(msgSSIDpwd);
delay(500);
}
void printMsg(int msg) {
char buf [128];
int i = 0;
while (pgm_read_byte_near(msg + i) != 0) {
buf[i] = pgm_read_byte_near(msg + i);
i++;
}
buf[i] = 0;
Serial.println(buf);
}
Скетч использует 1968 байт (6%) памяти устройства. Глобальные переменные используют 188 байт (9%) динамической памяти.
Сравните наш результат с более простой программой, без оптимизации:
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
Serial.println("Подключите смартфон к Wi-Fi RemoteXY, запустите APP RemoteXY.");
Serial.println("В приложении RemoteXY введите SSID и пароль вашей Wi-Fi сети.");
delay(500);
}
Скетч использует 1884 байт (5%) памяти устройства. Глобальные переменные используют 374 байт (18%) динамической памяти.
Вывод, мы смогли сэкономить 50% (динамической) оперативной памяти.
Ещё один вариант программы оптимизированный по использованию памяти:
PROGMEM const char msgSendRemoteXY[] = "Подключите смартфон к Wi-Fi RemoteXY, запустите APP RemoteXY.";
PROGMEM const char msgSSIDpwd[] = "В приложении RemoteXY введите SSID и пароль вашей Wi-Fi сети.";
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
Serial.println(flashString(msgSendRemoteXY));
Serial.println(flashString(msgSSIDpwd));
delay(500);
}
String flashString(int msg) {
String str;
int i = 0;
while (pgm_read_byte_near(msg + i) != 0) {
str += char(pgm_read_byte_near(msg + i));
i++;
}
return str;
}
Скетч использует 3424 байт (10%) памяти устройства. Глобальные переменные используют 198 байт (9%)