Qoʻllanma · Xotira · Saqlash
Flash, SRAM, NVS — maʼlumotlaring aslida qayerda yashaydi
Har bir ESP boshlovchisini uchta savol dovdiratib qoʻyadi: nega sozlamalar qayta yuklashdan keyin yoʻqoladi? nega oʻzgaruvchilar tiklanib (nolga) qaytadi? nega RAM tugab qoladi? Uchalasi ham bitta narsaga borib taqaladi — qaysi xotira nimani saqlashini bilish. Mana xarita va konfiguratsiyani toʻgʻri saqlash yoʻli.
Xotira turlari
- Flash — energiya-mustaqil (oʻchsa ham saqlaydi). Dasturingni va quvvat uzilishidan omon qoladigan maʼlumotlarni saqlaydi. Katta (MB), lekin yozishga sekin va har bir sektor uchun ~100k oʻchirish sikli bilan cheklangan.
- SRAM — oʻzgaruvchilar, uyum (heap) va stek uchun tez, oʻzgaruvchan (volatile) ishchi xotira. ESP32da ~320 KB, ESP8266da ~80 KB. Har qayta yuklashda oʻchiriladi — shuning uchun oʻzgaruvchilar tiklanadi.
- RTC RAM — chuqur uyquni omon qoladigan
minik boʻlak (
RTC_DATA_ATTRorqali). Quvvat toʻliq uzilganda baribir yoʻqoladi. - EEPROM — mayda maʼlumotni saqlashning eski Arduino usuli. ESPda haqiqiy EEPROM
yoʻq;
EEPROM.huni shunchaki flashda emulyatsiya qiladi. - NVS (Preferences) — ESP32/ESP8266da flashga «kalit-qiymat» konfiguratsiyasini saqlashning zamonaviy, toʻgʻri usuli: nomlangan, tiplangan, yeyilishni tekislovchi.
Nega sozlamalaring yoʻqoladi
Oʻzgaruvchilar SRAMda yashaydi, u esa oʻzgaruvchan — quvvatni oʻchirding, hammasi yoʻq boʻldi. Wi-Fi parolini, kalibrovka qiymatini yoki foydalanuvchi sozlamasini qayta yuklashlar orasida saqlab qolish uchun uni energiya-mustaqil xotiraga yozishing kerak: NVS yoki flash.
Konfiguratsiyani toʻgʻri saqlaymiz — Preferences (NVS)
ESPda EEPROM.hni unut. Preferences kutubxonasidan foydalan — u nomlangan,
tiplangan qiymatlarni NVSga yozadi va yeyilishni tekislashni oʻzi uddalaydi:
#include <Preferences.h>
Preferences prefs;
void saveConfig(const char* ssid, int interval) {
prefs.begin("cfg", false); // "cfg" nom fazosi, oʻqish/yozish
prefs.putString("ssid", ssid);
prefs.putInt("interval", interval);
prefs.end();
}
void loadConfig() {
prefs.begin("cfg", true); // faqat oʻqish
String ssid = prefs.getString("ssid", ""); // agar boʻsh boʻlsa, standart qiymat
int every = prefs.getInt("interval", 60);
prefs.end();
} setup() ichida loadConfig()ni chaqir — va sozlamalaring har qayta yuklashdan
keyin joyida, birinchi safar esa maʼqul standart qiymatlar bilan. Kutubxonalar Wi-Fi maʼlumotlarini
aynan shunday saqlaydi.
EEPROM vs Preferences
Klassik Arduinoda EEPROM — haqiqiy temir. ESPda esa u yoʻq: EEPROM.h flashda blokni
emulyatsiya qiladi, baytlab manzillanadi va maʼlumotni buzish oson. Preferences (NVS)
xom bayt siljishlari oʻrniga senga nomlangan kalitlar, tiplar va yeyilishni tekislashni beradi. Har
qanday yangi narsa uchun — faqat shuni ishlat.
RAM tugab qolyapti
SRAM kichik, uni tugatib yoki fragmentlab yuborish oson:
- Konstantalarni flashda saqla — string literallarini
F("...")ga oʻra (yokiPROGMEMni ishlat), toki ular SRAMni yemasin. - String bilan ovoragarchilikdan qoch — doimiy
String +ulanishi uyumni fragmentlaydi; yaxshisi qatʼiycharbuferlar yoki sigʻimni oldindan zaxira qil. - Uyumni kuzat —
ESP.getFreeHeap()ni chiqarib tur; barqaror pasayish — bu oqib ketish (leak). - Katta buferlar? PSRAMli ESP32-S3 senga kamera kadrlari va displeylar uchun megabaytlar beradi — chiplar qoʻllanmasiga qara.
Nima qayerda saqlanadi — shpargalka
- Dastur kodi → flash
- Oʻzgaruvchilar, uyum, stek → SRAM (oʻzgaruvchan)
- Konfiguratsiya va maʼlumotlar → NVS / Preferences
- Chuqur uyquni omon qoladi → RTC RAM
- Katta konstantalar / assetlar → flash (PROGMEM) yoki PSRAM
Qaysi xotira oʻzgaruvchan, qaysi biri yoʻqligini bilib olishing bilan sirlar tarqab ketadi: sozlamalar saqlanadi, oʻzgaruvchilar oldindan aytsa boʻladigan tarzda tutadi, RAM esa tugashdan toʻxtaydi.
Qiymat faqat rebutni emas, chuqur uyquni ham omon qolsin degan boʻlsang? Bu — RTC xotira.