RisalDash RisalDash

Гайд · Память · Хранение

Flash, SRAM, NVS — где реально живут твои данные

Три вопроса ставят в тупик каждого новичка на ESP: почему настройки слетают после перезагрузки? почему сбрасываются переменные? почему кончается RAM? Все три сводятся к одному — надо знать, какая память что хранит. Вот карта и как правильно сохранять конфиг.

ПамятьNVSPreferencesEEPROMESP32ESP8266
Карта памяти ESP32: разделы флеша (app, OTA, NVS, SPIFFS) и области SRAM
Флеш переживает перезагрузку, SRAM — нет; настройкам место в NVS.

Типы памяти

Почему настройки слетают

Переменные живут в SRAM, а она волатильна — выключил питание, и всё пропало. Чтобы сохранить пароль Wi-Fi, калибровку или пользовательскую настройку между перезагрузками, надо писать в энергонезависимое хранилище: NVS или flash.

Сохраняем конфиг правильно — Preferences (NVS)

Забудь про EEPROM.h на ESP. Используй библиотеку Preferences — она пишет именованные типизированные значения в NVS и сама следит за износом:

#include <Preferences.h>
Preferences prefs;

void saveConfig(const char* ssid, int interval) {
  prefs.begin("cfg", false);          // namespace "cfg", чтение/запись
  prefs.putString("ssid", ssid);
  prefs.putInt("interval", interval);
  prefs.end();
}

void loadConfig() {
  prefs.begin("cfg", true);           // только чтение
  String ssid   = prefs.getString("ssid", "");     // значение по умолчанию, если пусто
  int    every  = prefs.getInt("interval", 60);
  prefs.end();
}

Вызови loadConfig() в setup() — и настройки на месте после каждой перезагрузки, с разумными дефолтами в первый раз. Ровно так библиотеки хранят учётки Wi-Fi.

EEPROM против Preferences

На классическом Arduino EEPROM — настоящее железо. На ESP его нет: EEPROM.h эмулирует блок во flash, с адресацией по байтам и лёгкой порчей данных. Preferences (NVS) даёт именованные ключи, типы и выравнивание износа вместо сырых байтовых смещений. Для всего нового — только он.

Кончается RAM

SRAM маленькая, её легко исчерпать или фрагментировать:

Что где хранить — шпаргалка

Как только понимаешь, какая память волатильна, а какая нет, загадки исчезают: настройки сохраняются, переменные ведут себя предсказуемо, а RAM перестаёт кончаться.

Нужно, чтобы значение пережило глубокий сон, а не только ребут? Это RTC-память.