Partizionamento flash su ESP8266

Salve ragazzi,
con PlatformIO ho definito un partizionamento della flash in questo modo:
in platformio.ini specifico board_build.partitions = custom_4MB.csv
nel file custom_4MB.csv ho quanto segue:

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x100000,
app1,     app,  ota_1,   0x110000,0x100000,
logger,   data, fat,     0x210000,0x0F0000,
littlefs, data, lfs,     0x300000,0x100000,

Mi serve avere OTA; mi serve una partizione "logger" perché devo scrivere direttamente sulla flash per operazioni velocissime;
mi serve che la partizione littlefs sia su 0x300000, non so se vuole essere proprio li gli basta essere l'ultima, ma se la scambio di posizione col logger va tutto a scatafascio. Le impostazioni in questo modo vanno benissimo. Funziona, con PlatformIO compila e le cose stanno al posto giusto.

DOMANDA: come faccio a ottenere la stessa cosa su ArduinoIDE (2.3.6) ? Ci sono degli schemi di partizionamento predefiniti, e basta. A me serve che sia così.

Ci sto uscendo pazzo...

Si prega di utilizzare la lingua inglese nelle sezioni inglesi del forum. Argomento spostato nella sezione italiana del forum.

@corrado_casoni:

Buonasera e benvenuto nella sezione Italiana del forum,

:warning: prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... cortesemente, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15) e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

Buongiorno,
chiedo umilmente venia per non aver letto il regolamento e nemmeno, di conseguenza, effettuato la presentazione: ho gestito per anni un forum e quindi so che brutta vita tocca ai gestori;
tuttavia riguardo all'inglese non ci siamo proprio:


Come si evince dallo screenshot della finestra che ho lasciato aperta ieri sera subito dopo aver postato, ho scritto in italiano perché ho cliccato su "Italiano" e pareva quindi evidente di essere nella sezione Italiana del forum, otherwise I would have had no problem writing in English because fortunately I speak and write it every day, which would probably have been to my advantage as it increased the probability of a useful response.
Quindi, sappiate che se cliccare "Italiano" significa attivare una traduzione automatica del forum e non accedere alla sezione italiana, è qualcosa di estremamente fuorviante persino per uno come me che, anche solo per un fatto anagrafico, non è proprio "newbie".
In ogni caso, ringrazio per non aver cancellato "d'ufficio" il post, e a prescindere ringrazio per la pazienza che ogni amministratore di forum sa di doversi dotare in quantità. Provvederò subito a scrivere una presentazione nell'apposita sezione.
Grazie,
Corrado

NO, quella finestra è stata aggiornata a dove IO ho spostato il tuo post, già spostato in precedenza da un moderatore della sezione Inglese.

Il TUO post era stato originariamente fatto in 'IDE 2.x' (sezione Inglese) e poi spostato in 'Italiano->Generale' da dove, IO, l'ho poi spostato in 'Italiano->Software' (più adatto al tipo di domanda) che è quanto la tua schermata mostra, quindi ...

... mi spiace ma hai selezionato TU l'errata sezione inizialmente e poi in due, in due tempi diversi, noi abbiamo fatto due differenti spostamenti :wink:

Guglielmo

buffa cosa, perché ricordo di aver cliccato su "Italiano" e scritto in Italiano per questo motivo, MA probabilmente mi sono rincoglionito e basta: se ho sbagliato chiedo scusa, non voglio fare polemica. Ho aggiunto la presentazione nel thread indicato e rinnovo il mio sincero apprezzamento per chi come te deve combattere ogni giorno con i pasticci dei nuovi arrivati

:hugs: grazie, comunque tranquillo, è praticamente cosa giornaliera il dover spostare discussioni da una sezione ad un'altra :grin:

Guglielmo

Non mi è chiaro perché vuoi creare una partizione "logger", ma non basta scrivere i tuoi log direttamente sulla partizione "littlefs" creata di default?

Ad ogni modo, con ESP32 sarebbe sufficiente mettere il file .csv all'interno della cartella dello sketch (anche con Arduino IDE), ma con ESP8266 purtroppo non è cosi facile perché lo schema di partizione viene creato usando uno script di compilazione.

Per usarne uno custom quindi, devi editare il file boards.txt modificando la sezione che riguarda la scheda che stai usando o meglio ancora, aggiungere una nuova sezione per definire una tua board custom (cosi rimangono invariate quelle già presenti).

Il problema è che ad ogni aggiornamento del core ESP8266, questo file verrà sovrascritto, anche se in realtà il core in questione non viene più aggiornato da tempo.

Grazie per la prima risposta.

Ho necessità di un log incrementale all'interno di un processo che deve durare pochi millisecondi e senza interrompere o ritardare altri processi simultanei. Aggiungere in "append" un record con LittleFS implica un overhead enormemente superiore e bloccante, data anche l'architettura single core di esp8266. LittleFS mi serve per alcuni files da poter gestire semplicemente (static files del server web, file di configurazione ecc..)

Si: avevo individuato questi script, ma più che altro speravo ci fosse un sistema più pratico, anche perché questo mi costringe a scrivere nel readme.md del repository delle instruzioni da dare affinché qualcun altro vada a effettuare manualmente le stesse operazioni.
Il mio desiderio era quello di distribuire un progetto "compatibile" con ArduinoIDE e non solo PlatformIO.

Capisco.
Per quanto ne so, non c'è un modo a prova di "utente Arduino".
Magari potresti aggiungere qualche script che automatizza l'operazione?

Questa poi è la ragione principale per cui non uso Arduino IDE solitamente... tutto deve essere configurato a livello di editor, mentre l'ideale è che la configurazione sia a livello di progetto (come del resto fanno la stragrande maggioranza degli IDE un po' più avanzati).

:thinking: sto valutando una soluzione alternativa...

  1. uso solo una partizione LittleFS, più grande
  2. assieme agli altri files che mi servono, aggiungo un file "LOGGER.db" grande un po' meno dello spazio che avevo destinato alla partizione dedicata, che contiene dei marcatori di inizio, dummy record, e fine.
  3. All'inizializzazione della mia classe logger, fa una scansione di tutta la partizione LittleFS e cerca i marcatori di inizio e fine del file LOGGER.db, e si assicura che siano contigui
  4. usa gli indirizzi dei marcatori per calcolare le pagine di flash utilizzabili, che corrispondono alla pagina che contiene il marcatore di inizio + 1, fine -1 (questo per evitare di andare a sovrascrivere altri files in LittleFS)
  5. il resto funziona come prima, solo con un po' di spazio utile in meno
    In questo modo, conservo il funzionamento e la velocità della mia classe logger, ma non ho bisogno di un partizionamento dedicato e posso allocare dinamicamente la dimensione del log semplicemente creando un file LOGGER.db della dimensione desiderata.

Può essere un buon compromesso secondo te ? Tra l'altro mi verrebbe comodo per scaricare l'intero LOGGER.db da web server come static file, piuttosto che estrarlo e generarlo dinamicamente per restituirlo come payload con una apposito server.on("/logdata", HTTP_GET...

Mi sembra un buon compromesso, anche se un po' laborioso da gestire.

Hai valutato anche l'idea di usare SQLite3 come sistema di salvataggio dei record di log?
Non le ho mai usate, ma ci sono librerie sia per ESP8266 che per ESP32 anche se non ho idea di tempi di risposta.

SQLite3 di suo è un sistema di gestione database molto efficiente e veloce, quindi in teoria dovrebbe garantire buone prestazioni (al netto dell'implementazione su ESP).

Volevo fare qualche prova con un Wemos che mi ritrovo nel cassetto, hai un esempio di record da prendere a riferimento?

Non posso usare SQLite3 perché su un misero esp8266 deve starci già tanta altra roba, e oltre al non basso peso di SQLite in termini di codice e soprattutto di heap, l'overhead di una scrittura di un record è comunque maggiore del paio di millisecondi che impiega la mia soluzione (considera che nei momenti di picco deve scrivere un record ogni 10ms e nel mentre fare anche altre cose!), e poi c'è un ulteriore problema: ho bisogno che sia fault tollerant e in caso di crash sono disposto a perdere i record della pagina cache che tengo in ram, 4k, pazienza; con SQLite rischio di perdere tutto. Proverò a vedere anche se compila e funziona su ESP32 o RP2040 ma non ci metto la mano sul fuoco.
Sto preparando una library del mio FlashLogger che butterò su github, negli esempi ci sarà anche un benchmark con un confronto con la stessa cosa fatta scrivendo in append un file su LittleFS