C++ #include ram probléma [MEGOLDVA]

Fórumok

https://github.com/earlephilhower/ESP8266Audio könyvtárat szeretném használni, de ez bootoláskor dől el hogy tényleg kell-e.

Ha csak #include "AudioFileSourceSPIFFS.h" van a kódban, semmi más, akkor is megeszik vagy 10kb ramot. Átnéztem de nem találom a bűnöst.

Egy extern boolt szeretnék beletenni, ha az false, felejtse el az egész projektet, de arra se jövök rá hogy hova tűnik a ram.

THX!

Hozzászólások

Ha linkeket, includeolod a header fájlt, a memória foglalás - nem dinamikus - megtörténik, Ha ez futamidejű bool opció, akkor nem Uszód meg. Nézd meg a forráskódját, mit foglal le (valami Time buffer lesz), csökkentsd a méretet vagy tedd dinamikusra. A lib vélhetően nem runtime függő include-ra készült. 8266 esetén talán nem fáj annyira 10kB

Van egy ilyenem:

#include <ESPFlashString.h>

uint8_t sg[55];        // setup uint8_t gpio (espflash)

ESPFlash<byte> sgf("/sg");
bool success_sg = sgf.getFrontElements(sg, sizeof(sg));

Ebből már a könyvtár tudhatja hogy van-e rá szükség. Hülyeséget írtam. Ötlet?

Szerk: vagy nem?

Felhúztam egy ArduinoIDE-t (platformIO-t használok), 8266-os fordítást megoldottam.

Egy üres projektbe berántottam LIB-et, de az 33kB-ot adott hozzá. Sikerült nem üres projektben 15kB növekményt elérni, ezzel lehetett tesztelni.

Valami miatt nem tdtam csökkenteni a 15kB-ot (ami fura), de próbált ki a Te configodban is, hogy pl. a AudioGeneratorWAV.cpp fájlban megszünteted a baromi hosszú (és sok) Serial.printf_P(PSTR("...")) stringet, ami a kódterületre rak be kb. 3-5kB-nyi szöveget. Ezzel kicsit lehet csökketeni, talán.

Köszi, feltétlen kidobálom, de a ram a gond, nem a flash.

 

Idáig nem foglal semmi ramot.

#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorWAV.h"
AudioFileSourceSPIFFS *wavfile = {nullptr};
AudioGeneratorWAV *wav = {nullptr};

Az üres src könyvtárba elkezdtem bedobálni amit hiányol.

AudioFileSource.h
AudioFileSourceFS.cpp
AudioFileSourceFS.h
AudioFileSourceSPIFFS.h
AudioGenerator.h
AudioGeneratorWAV.cpp
AudioGeneratorWAV.h
AudioLogger.cpp
AudioLogger.h
AudioOutput.h
AudioOutputI2S.cpp
AudioOutputI2S.h
AudioOutputI2SNoDAC.cpp
AudioOutputI2SNoDAC.h
AudioStatus.h

Ha csak ez van az src mappában, semmi ramot nem foglal és működik, még figyelmeztetést se ad a fordító. Amilyen profi ez a könyvtár, annyira szarul van megírva.

 

#if(AUDIO_E)
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorWAV.h"
#include "AudioOutputI2SNoDAC.h"
AudioGeneratorWAV *wav = {nullptr};
AudioFileSourceSPIFFS *wavfile = {nullptr};
AudioOutputI2SNoDAC *wavout = {nullptr};
bool waven = false;
#endif


void boottest() {

#if(AUDIO_E)
if (waven) { 
  AudioFileSourceSPIFFS *wavfile;
  AudioOutputI2SNoDAC *wavout;
  String pl = USRDIR + "pcm0808m.wav";
  wavfile = new AudioFileSourceSPIFFS(pl.c_str());
  wavout = new AudioOutputI2SNoDAC();
  wav = new AudioGeneratorWAV();
  wav->begin(wavfile, wavout);
  }
#endif
}

void loop() {

#if(AUDIO_E)
  if (waven == true) { 
    if (wav->isRunning()) {
      if (!wav->loop()) {
        wav->stop();
        waven = false;
        delete wavfile;
        delete wavout;
        delete wav;
        wavfile = NULL;
        wavout = NULL;
        wav = NULL;
        }
      }
    }
#endif

}

Amennyire szét van szedve, annyira zavaros az include hierarchy. Lehet mindent beszippant, bármit is csinálsz.

Vélhetően úgy tervezték, hogy csak ezt fogja tudni, nem egy nagyobb rendszer része lesz, emiatt nem foglalkoztak a memóriával. Vannak részei, amik esp32-n is mennek, ott nem számít annyira 10-20kB.

szerk: válasz:  neduddg

Kitöröltem a felesleges fájlokat. Fogalmam sincs róla mi zabálta meg a ramot.

Ezek maradtak az src mappában:

AudioFileSource.h
AudioFileSourceFS.cpp
AudioFileSourceFS.h
AudioFileSourceSPIFFS.h
AudioGenerator.h
AudioGeneratorWAV.cpp
AudioGeneratorWAV.h
AudioLogger.cpp
AudioLogger.h
AudioOutput.h
AudioOutputI2S.cpp
AudioOutputI2S.h
AudioOutputI2SNoDAC.cpp
AudioOutputI2SNoDAC.h
AudioStatus.h

 

void boottest() {

#if(AUDIO_E)
if (waven) { 
  String pl = USRDIR + "pcm0808m.wav";
  wavfile = new AudioFileSourceSPIFFS(pl.c_str());
  wavout = new AudioOutputI2SNoDAC();
  wav = new AudioGeneratorWAV();
  wav->begin(wavfile, wavout);
  }
#endif
}

A fenti függvény így helyes, véletlen bent maradt két sor. Nem tudom mi a rák van vele, de ha az egész "gyári" cucc benne van akkor bukok 10kB ramot. Ellenőrizhető, kíváncsi vagyok rá ki fejti meg.

Teve? Áldom a neved is amióta kijavítottad a .tar könyvtárat.

Hasonlo esetekben azt szoktam hogy a *.elf-re raengedek egy `nm main-akarmi.elf | sort` -ot es abbol ki lehet banyaszni hogy mik azok a statikus objektumok (nev szerint) amik megeszik a RAM-ot. 

Illetve forditsd -fdata-sections kapcsoloval + utana -Wl,--gc-sections modon linkeld. Akkor kiszedi azokat a statikus objektumokat amikre nincs hivatkozas. 

Az nem opcio, hogy egy kulso, dinamikusan betoltott kodbol hasznalod ezt, amit csak akkor toltesz be, ha a boolod szerint kell?

A strange game. The only winning move is not to play. How about a nice game of chess?