دليل · الذاكرة · التخزين
Flash و SRAM و NVS — أين تعيش بياناتك فعلاً
ثلاثة أسئلة تُربك كل مبتدئ على ESP: لماذا تختفي إعداداتي بعد إعادة التشغيل؟ لماذا تُصفَّر المتغيرات؟ لماذا تنفد الـ RAM؟ تعود الثلاثة جميعها إلى أمر واحد — معرفة أي ذاكرة تحمل ماذا. إليك الخريطة، وكيف تحفظ الإعدادات بالطريقة الصحيحة.
أنواع الذاكرة
- Flash — غير متطايرة. تحتوي على برنامجك، ويمكنها تخزين بيانات تبقى بعد انقطاع التيار. كبيرة (بالميغابايت) لكنها بطيئة في الكتابة ومحدودة بنحو 100 ألف دورة مسح لكل قطاع.
- SRAM — ذاكرة عمل سريعة ومتطايرة للمتغيرات والكومة والمكدس. نحو 320 كيلوبايت على ESP32، ونحو 80 كيلوبايت على ESP8266. تُمحى عند كل إعادة تشغيل — لهذا تُصفَّر المتغيرات.
- RTC RAM — شريحة صغيرة تبقى بعد النوم
العميق (عبر
RTC_DATA_ATTR). ومع ذلك تُفقَد عند قطع التيار كلياً. - EEPROM — الطريقة القديمة في Arduino لحفظ البيانات الصغيرة. على ESP لا يوجد EEPROM
حقيقي؛ فمكتبة
EEPROM.hتحاكيه في Flash فقط. - NVS (Preferences) — الطريقة الحديثة والصحيحة لتخزين إعدادات «مفتاح-قيمة» في Flash على ESP32/ESP8266: مسمّاة ومحددة النوع ومع موازنة تآكل.
لماذا تختفي إعداداتك
تعيش المتغيرات في 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); // مساحة الأسماء "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 صغيرة، ومن السهل استنفادها أو تجزئتها:
- أبقِ الثوابت في Flash — غلّف حرفيات النصوص بـ
F("...")(أو استخدمPROGMEM) حتى لا تستهلك SRAM. - تجنّب كثرة استخدام String — الوصل المتكرر بـ
String +يجزّئ الكومة؛ فضّل مخازنcharثابتة أو احجز السعة مسبقاً. - راقب الكومة — اطبع
ESP.getFreeHeap()؛ الانخفاض المطّرد يعني تسريباً. - مخازن كبيرة؟ يمنحك ESP32-S3 المزود بـ PSRAM ميغابايتات لإطارات الكاميرا والشاشات — راجع دليل الشرائح.
ما الذي يُخزَّن أين — الجدول المرجعي
- كود البرنامج ← Flash
- المتغيرات والكومة والمكدس ← SRAM (متطايرة)
- الإعدادات وبيانات الاعتماد ← NVS / Preferences
- يبقى بعد النوم العميق ← RTC RAM
- الثوابت والأصول الكبيرة ← Flash (PROGMEM) أو PSRAM
بمجرد أن تعرف أي ذاكرة متطايرة وأيها ليست كذلك، تتبخّر الألغاز: تبقى الإعدادات، وتتصرف المتغيرات كما ينبغي، ويتوقف نفاد الـ RAM.
هل تريد لقيمة أن تبقى بعد النوم العميق، لا مجرد إعادة التشغيل؟ تلك ذاكرة RTC.