Wpis z mikrobloga

Mam ESP8266 i ESP32. Robiąc różne rzeczy IoT natrafiłem na problem z małą ilością pamięci Heap (ESP8266). Wielokrotnie zdarzało się, że pamięci Heap było za mało, co powodowało crash ESP i ponowne jego uruchomienie.
Mam zatem pytanie do osób korzystających z ESP8266 oraz ESP32.
Robiłem przed chwilą test tej pamięci poprzez komendę ESP.getFreeHeap() i moje wyniki są następujące: ESP8266 = 50KB, ESP32 = 307KB. Pytanie mam, czy wartości te (KB) są stałe dla tych modułów? Czy może są inne odmiany ESP32 lub ESP8266 z większą ilością pamięci Heap?
PS. Na internecie trafiam na wartości, że ESP32 ma Pamięć SRAM 520 KB, a tymczasem ja otrzymałem wartość jedynie 307KB - dlaczego?

#arduino #nodemcu #esp8266 #esp32 #mikrokontrolery
  • 14
@MisiekD: Co takiego robisz że brakuje ramu? Mi pod 8266 zabrakło tylko przy odtwarzaczu strumieni ogg/mp3 ale dołożyłem 1 Mbit na SPI i śmigało bez problemu ( ͡° ͜ʖ ͡°)
  • 0
@dktr: Że co, dołżyłeś RAM-u??? To tak można? :D
Czemu mi brakuje, buduję czasami zaawansowane zestawy i bywa, że się wykrzacza. Dużo różnych sensorów, przekaźników i z tego co widzę to może być tak, że WiFi jest niestabilne pod względem wykorzystania RAM-u. Na innym module zauważam, że biblioteka Blynk IOT zużywa bardzo dużo RAM-u i powoduje codzienne restarty :/
ESP32 ma Pamięć SRAM 520 KB, a tymczasem ja otrzymałem wartość jedynie 307KB - dlaczego?


@MisiekD: bo reszta jest zajęta przez inne rzeczy, statyczne alokacje, stosy dla wątków, cache dla flasha, kod siedzący w RAMie (żeby się szybciej wykonywał)

Przy kompilacji powinieneś mieć podsumowanie ze statycznymi alokacjami oraz plik map ze szczegółami

Total sizes:
Used stat D/IRAM: 43732 bytes ( 277564 remain, 13.6% used)
.data size: 3680 bytes <----------- dane zainicjalizowane
kurcze, nie generuje mi takiego pliku map. Czym to kompilujesz?


@MisiekD: gcc, innego kompilatora przecież do tego nie ma. Plik map może być utworzony na etapie linkowania (potrzebna jest opcja -Map=nazwaprogramu.map) albo później narzędziem objdump. Zlokalizuj gdzie masz plik elf po zakończeniu kompilacji i wywołaj objdump na nim, np. dla esp32-c3 (riskV) robię to tak:

~/.espressif/tools/riscv32-esp-elf/esp-12.2.0_20230208/riscv32-esp-elf/bin/riscv32-esp-elf-objdump -x dupa.elf
Rozmiar:

~/.espressif/python_env/idf5.1_py3.10_env/bin/python ~/esp/esp-idf/tools/idf_size.py blink.map
via Android
  • 0
@walokid zgadza się, ale w np. innym układzie już mam układ pinów pod ESP8266, więc ESP32 chyba odpada. Czy są może takie same płytki z ESP32 z rozstawieniami interfejsów/pinów jak ESP8266?
Jeśli mówisz o esp32 i esp8266 to nie mają takiego kształtu. Ale nie mam pewności czy nie masz na myśli przypadkiem dev boardów z procesorami esp32 i 8266
  • 0
@zetisdead: Zrobiłem tak jak pisałeś, ale wypluwa mi tylko to:
`C:\Users\Misiek\Documents\PlatformIO\Projects\ESP8266 Kotłownia (czujniki temperatury, pompy obiegowe, wyświetlacz, 20x4)\.pio\build\Project\firmware.elf: file format elf32-little
C:\Users\Misiek\Documents\PlatformIO\Projects\ESP8266 Kotłownia (czujniki temperatury, pompy obiegowe, wyświetlacz, 20x4)\.pio\build\Project\firmware.elf
architecture: UNKNOWN!, flags 0x00000112:
EXECP, HASSYMS, DPAGED
start address 0x401000c0

Program Header:
LOAD off 0x000000d4 vaddr 0x00000000 paddr 0x00000000 align 212
filesz 0x00000000 memsz 0x00000000 flags ---
LOAD off 0x00001000 vaddr 0x3ffe8000 paddr 0x3ffe8000 align 2
12
filesz
via Android
  • 0
@zetisdead ogólnie rzecz biorąc, problem mąm taki, że np.
Programuje sb ESP8266, włączam go teraz, pracuje 1h i nąjniższa wartość pamięci heap po 1h to 30KB, 3 dni później najniższa wartość heap zdarza się, że np
2KB. No i bywa, że spada poniżej tych 2KB, a to powoduje restart i tego restartu chcę uniknąć.
Masz jakieś przypuszczenia z czego to mogłoby być? I jak uniknąć?

PS. W ESP8266 używam WiFi jako klient
Masz jakieś przypuszczenia z czego to mogłoby być?


@MisiekD: wycieki pamięci - pamięć jest alokowana, ale nie jest zwalniana po zakończeniu jej użycia.

I jak uniknąć?


Albo tak pisać kod, żeby nie było wycieków ( ͡º ͜ʖ͡º) a jak już są to pisać kod przenośnie - tak, żebyś mógł go uruchomić na PC. Wtedy będziesz miał do dyspozycji różne narzędzia typu valgrind i sanitizery dostarczane przez