[ Megoldva ] ESP32 SPIFFS egyenletes olvasása hogyan lehetséges?

ESP32-re Arduino IDE felülettel próbálok elkészíteni egy kódot, ami a feltöltött fájlban lévő adatokat folyamatosan olvasva, azt az ESP egyik GPIO-jára teszi ki. A jeleknek egyenletesen kellene a kimeneten megjelennie.

Szépen is működik kicsi fájlal, de amint nagyobb fájlt töltök fel, a SPIFFS megakasztja néha a folyamatot. Gondolom, valami pufferbe tölthet be adatokat. Megpróbáltam a feldolgozás előtt egy tömbbe beolvasni az adatokat, ami meg is oldotta a problémát, de a tömböm maximális mérete 64K lehet. Nekem pedig 100K feletti fájljaim is lennének.

Tehát a kérdésem az lenne, hogyan lehet többszáz kilobájtnyí adatot egyenletes sebességgel felolvasni a SPIFFS fájlrendszerből Arduino IDE felülettel?

Hozzászólások

Azt irtad, hogy beolvasol egy jo adagot, majd azt folyamatosan tolod ki. Mi akadalyoz abban, hogy egy 64k helyett ketto 32k-s buffered legyen es valts koztuk a file olvaso logikaval?

Persze, nem tudom, hogy Arduinobol hogyan ellenorzod, hogy hol tart a DMA a GPIO irasaval, azaz mikor kene valtanod, de en erre indulnek.

Pontosíts kérlek, mert nem értem. Gondolom, az lenne a trükk, hogy míg az egyik 32k-s tömböt olvasom, addig a másik tömb feltöltődik, anélkül, hogy az elsőt olvasó kódom megakadna. Ilyet tudok Arduino IDE-vel csinálni? Ott nem csak egy szálon fut a kód?

Az Arduino IDE-n belül írhatsz általános Arduino kódot, ami elvben platformfüggetlen, többfél Arduino boardon is fut, amik akár teljesen eltérő architektúrájúak is lehetnek. De ha neked egy konkrét Arduinod van, például Arduino UNO ATMEGA 328P csippel, akkor csinálhatsz arra nézve specifikus megoldást is. Még mindig az IDE-n belül simán írhatsz olyat, ami az ATMEGA csip regisztereit direktben vezérli. És ugyanerre a hardverre Makefile-os projekttel tetszőleges C vagy akár ASM projektet is csinálhatsz.

Ja, látom, hogy ESP32... Én úgy csinálnám ezt, hogy egy időzítőt állítanék be, és az adagolná kifelé az adatokat. És a főprogram pedig a buffert írná blokkolva addig, ameddig ki nem ürül kellő számú bájt a kimeneti pufferből. A kimeneti puffer lehetne például egy ringbuffer ( https://en.wikipedia.org/wiki/Circular_buffer ), ezt olvasná az időzítő és töltené a főprogram amint van benne elég hely amit beleírhat.

Ha nagyobb időbeli pontosság kell, akkor a legtöbb MCU-nak van olyan megoldása, hogy pontosan időzítve adjunk ki jeleket a lábakon, de hogy az ESP32-n van-e és hogy hogy működik azt nem tudom. AVR-en timer output compare mode a neve ennek a funkciónak és 1 órajel pontosságig korrekt jelformákat is ki lehet adni vele.

Passz. Arduinot nagyon reg nem hasznaltam.

ESP-IDF teljesen kizart? Lehet vegyes kodot is irni, de akkor mar inkabb tiszta IDF...

Egyebkent meg google: esp32 arduino multi core

https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/

 

De ha mar mikrokontrollert hasznalsz, erdemes megismerkedni a lelkivilagaval. Az ilyen magasabb szintu keretrendszerek, mint az Arduino, elfedhetnek par specialis megoldasi lehetoseget, amelyre szukseed lehet.

Köszönöm az ötleteket. Mivel az ESP32-nek két CPU magja van, végül úgy sikerült megoldanom, hogy az alapértelmezetten nem használt magra (0.) raktam a fájlolvasó kódot, ami egy 64K-s pufferbe tölt be a fájlból, a feldolgozó meg maradt az 1-es magon, és olvassa a pufferből az adatokat, most már zökkenőmentesen.