Organizacja pamięci w ESP32 jest elastyczna. Wyróżniamy kilka rodzajów pamięci:

Omówmy zatem co jest co i z czym się je.

IRAM

ESP-IDF alokuje część regionu Internal SRAM0 jako pamięćRAM instrukcji. Poza pierwszym blokiem 64kB, którego używa PRO i APP CPU jako pamięc typu cache, reszta jest dostępna jako pamięć RAM. Pamięć ra przechowuje cześći aplikacji, które muszą być wykonywane z RAM.
Kilka komponentów, np. stos WiFi, są alokowane w tej pamięci przez linkera.
Jeśli potrzebujemy cześć kodu umieścić w tej pamięci, używamy słówka kluczowego IRAM_ATTR.
Co powinno zatem trafić do tej pamięci?

  • handlery przerwań muszą być umieszczone w IRAM. Mogą one wywoływać tylko funkcje umieszczone w IRAM lub w ROM. Dodatkowo, wszystko do czego handlery ISR się odwołują musi być umieszczone w IRAM. Dotyczy to np. ciągów znaków globalnych.
    Mała uwaga, na dzień dzisiejszy, API FreeRTOS jest umieszczone w IRAM. Można więc bezpiecznie wywoływać je z handlerów ISR.
  • wszystkie dane, do których czas dostępu jest krytyczny powinny trafić do IRAM. Wszystko co jest czytane z flasha, idzie przez 32kB cache. Umieszczenie więc danych krytycznych w IRAM może poprawić responsywność w dostępnie do nich, ponieważ omija cache.

IROM

Wszystko co nie jest oznaczone jako IRAM lub RTC, trafia do pamieci flash. To pamięć przechowująca wszystkie dane apliakcji. Dostęp do niej odbywa się przez pamięć cache o wielkości 32kB.

RTC fast memory

Pamięć zarezerwowana dla kodu wykonywanego po obudzeniu procesora z głebokiego uśpienia.

DRAM

Nie stała i zainicjalizowane zerem dane trafiają do tej pamięci przez linkera. Pamięć ma rozmiar256kB, ale jest zmniejszona o 64 kB przez Bluetooth (jeśli używany) i o 16 do 32 kB przez tracer pamięci.
Pozostała pamięć po zaalokowaniu statycznych danych, jest dostępna jako sterta.

Stałe dane, mogą być też wrzucone do pamięci DRAM, jeśli np. są używane przez handler ISR. Służy do tego atrybut DRAM_ATTR.

DROM

Domyślnie, stałe dane są wrzucane przez linker do regionu 4MB, który jest używany do dostępu do pamięci flash przez MMU i cache.

RTC slow memory

Globalne i statyczne zmienne, używane przez kod z pamięci RTC (np. kod wykonywany w czasie głębokiego uśpienia) musi być umieszczony w tej pamieci.