Estrarre e Reinserire SD

Ripeto, Nella mia ( e non mi stancherò mai di dirlo ) totale ignoranza in programmazione,
Non ho trovato da nessuna parte, per esempio:
Sd2Card card;
SdVolume volume;
SdFile root;
card, volume,root non sono menzionati nel reference ma sono proprio quelle variabili che grazie alla dritta di Pablos mi hanno
permesso di risolvere il mio problema.

Grazie

Quelle sono le definizioni per creare le istanze (copie) degli oggetti (classi) della libreria. Questo perché la libreria fornire un oggetto, sei poi tu ad usarlo per crearne di tuoi, è come il tipo dato "byte", non puoi usarlo per memorizzare un valore ma devi dire al compilatore di usarlo per definire una variabile tua a cui dai un nome.
Spero di essermi spiegato.

PS:
un consiglio che do sempre, guardati gli esempi allegati all'IDE, se apri "File/Esempi/SD" ci sono degli sketch pronti da studiare per capire come usare la SD.

Perché non usi semplicemente i 2 piedini dei lettori SD Card che ti indicano se la sd c'e' o non c'e'? magari quelli ad inserzione Clik/Clak.
Lo mandi in ingresso digitale e tramite interrupt oppure semplicemente con un controllo verifichi, prima di scrivere sulla sd, se e' inserita o meno.
Quando invece sfili la SD questo contatto si chiude o apre prima che la sfili, dopo il clik/clak, e interrompi la scrittura se in quel momento sta scrivendo.

Quel contatto lo usero per vedere se posso andare a scrivere, ma non sono proprio sicuro che se stà scrivendo riesca anche a leggere lo stato dello switch, premo ed estraggo e in un lampo patatrak.

PS gli interrupt li uso gia per leggere l'encoder che uso al posto dei pulsanti per gestire la scheda.

Grazie

Non credo tu possa interrompere una scrittura. Se stai spedendo dei dati alla SD e l'utente sfila la scheda, son dolori.

diciamo che una parte di operazioni è atomica (non interrompibile) e una parte è NON atomica.

dal momento in cui chiudi tutti i file, possiamo dire di essere in NON atomica, il problema è che:

  1. arriva interrupt che setta un flag (non puoi chiudere un file da una ISR, causa SPI)
  2. il flag interrome il loop di scrittura
  3. il file viene chiuso (chiusura file, aggiornamento tabelle FAT, finalizzazione di buffer arduino e SD su memoria)

Ora, attenzione che il punto 2 non può chiudere il file immediatamente, ma deve finire di scrivere in modo che alla prossia riapertura sia interpretabile; se noi scriviamo un dato per riga, ad esempio, dovremo finire di scrivere la riga! Quindi la nostra logica rende un operazione non atomica (scrivere una serie di caratteri) in una operazione atomica, altrimenti il file risulterà corrotto. Salvo implementare un algoritmo che se vede l'ultima riga corrotta la elimina.

Restano da verificare i tempi di stacco con i tempi di esecuzione dei punti cui sopra.

lesto:
diciamo che una parte di operazioni è atomica (non interrompibile) e una parte è NON atomica.

dal momento in cui chiudi tutti i file, possiamo dire di essere in NON atomica, il problema è che:

  1. arriva interrupt che setta un flag (non puoi chiudere un file da una ISR, causa SPI)
  2. il flag interrome il loop di scrittura
  3. il file viene chiuso (chiusura file, aggiornamento tabelle FAT, finalizzazione di buffer arduino e SD su memoria)

Ora, attenzione che il punto 2 non può chiudere il file immediatamente, ma deve finire di scrivere in modo che alla prossia riapertura sia interpretabile; se noi scriviamo un dato per riga, ad esempio, dovremo finire di scrivere la riga! Quindi la nostra logica rende un operazione non atomica (scrivere una serie di caratteri) in una operazione atomica, altrimenti il file risulterà corrotto. Salvo implementare un algoritmo che se vede l'ultima riga corrotta la elimina.

Restano da verificare i tempi di stacco con i tempi di esecuzione dei punti cui sopra.

Ecco, era piu' o meno quello che volevo dire io, ma senza le conoscenze che ha Lesto! :smiley:
Grande Lesto!

Se l'utente estrae brutalmente la schedina durante una scrittura puoi mettere tutti i controlli software del mondo ma il file system di quella schedina lo puoi buttare :wink:

dipende, se hai un sistema che siaccorge dell'estrazione prima che i contatti si stacchino, e durante quel tempo riesci a finalizare la scrittura allora non cisono prolemi.
A questo punto resta da capire quanto possa essere complesso costruire un "ritardatore di estrazione meccanico"

lesto:
A questo punto resta da capire quanto possa essere complesso costruire un "ritardatore di estrazione meccanico"

Ah beh ... se ti metti a giocare con la meccanica ... allora è più semplice fare (... come si fa per i CD/DVD) un blocco totale dell'estrazione comandato da software (... dovrebbe bastare un minuscolo solenoide che alza una linguetta davanti alla card) :wink:

Guglielmo

uhmm, ma se setraggo la card quando "salta"il solenoide... piùttosto pulsantino di richiesta, appena finisce la scriture il solenoide "sputa" la card :slight_smile:

lesto:
uhmm, ma se estraggo la card quando "salta"il solenoide ...

In che senso ??? Non la puoi estrarre ...

... basta una linguetta che, quando il piccolo solenoide è attivato, si mette dietro alla SD e ... NON la puoi più fisicamente estrarre. Da SW comandi il solenoide (... ripeto, come alcuni SW fanno con i CD/DVD ... il principio è sempre quello) :wink:

Guglielmo

la puoi "spingere", come il carrellino del pc, no?

il problema del tuo sistema è se scatta il solenoide quando sto estraendo la SD.

lesto:
la puoi "spingere", come il carrellino del pc, no?
il problema del tuo sistema è se scatta il solenoide quando sto estraendo la SD.

Forse non ci capiamo ...

  1. l'utente inserisce la SD
  2. il SW se ne accorge e attiva il solenoide
  3. a questo punto la SD è meccanicamente bloccata
  4. il SW fa quello che deve fare e quando il SW decide che ha finito ed è sicuro rimuoverla ... disattiva il solenoide
  5. l'utente può estrarre la SD (ora e solo ora, altrimenti è bloccata)

... i solenoidi non è che scattano da soli eh XD XD XD

Guglielmo

quando estrai esiste una fazione di secondo (diciamo circa 100-500ms) in cui la SD è attaccata ai contatti (in quanto lo stacco non è immediato) ma passa sopra al blocco del solenoide, a meno che questo non permetta un gioco, che però rischia all'utente disattento di creare falsi contatti.

Seil SW prende il controllo della SD mentre la stai estraendo, succede un patatrac hw & sw.

Frena ...
... il solenoide io lo immaginavo esterno (cosa fattibili con gli attuali lettori di SD, mica voglio che uno deva inventare un nuovo lettore :wink: ) che alza una linguetta DIETRO la SD (... dietro la parte che rimane visibile quando l'hai completamente inserita) ... non c'entrano nulla contatti o quant'altro ...

  1. infili come fai oggi la SD nel normale lettore
  2. il SW si accorge che hai infilato la SD e, a questo punto, alza la linguetta.
  3. in queste condizioni tu la SD non la puoi sfilare. C'è una linguetta dietro, dove tu dovresti spingere con il dito per farla saltare fuori.
  4. il software la usa, fa quello che deve fare e poi, finito tutto, decide che tu la puoi ritirare, quindi ... comanda alla linguetta di abbassarsi
  5. la SD ora è libera e tu puoi con il dito spingerla e farla uscire

... non c'è assolutamente possibilità d'errore :wink:

Guglielmo

questo sistema funziona fintanto che il SW non decide che deve fare una seconda scrittura.
Cosa farebbe?

  1. richiude lo slot, scrive, e lo riapre.
    2.attende che comunque tu estrai la SD e la reinserisci

Ecco, se proprio in quel momento, nel punto 1., mentre decide di chiudere di nuovo, io estraggo la SD?

Lesto ... non complicarti la vita da solo ... guarda come funziona con i CD/DVD ... ecco, occorre fare la stessa cosa !

Il Sw deve gestire ovviamente la situazione di introduzione ed estrazione ...
... una volta che gli dici che vuoi estrarre la SD (... perché in qualche modo, se vuoi fare una cosa sicura, glie lo dovrai dire) il SW fa l'"umount" NON fa più il "mount" se non la tiri fuori e non la reinserisci ... così non ci sono dubbi :wink:

Del resto è ovvio che, se vuoi fare una cosa "affidabile", devi imporre delle regole ... altrimenti l'utente farà sempre come cavolo gli pare ... XD

Guglielmo

P.S. : Ovviamente non siamo sotto Linux .. umount e mount sono solo per chiarire il concetto

arduino ha una ram/eeprom limitata, diciamo 1 ora di letture.

allora il mio sistema è migliore, fintanto che non premi il tasto NON avviene l'unmount, e quindi ogni tot l'arduino scarica i dati su SD

Col tuo sistema ogni ora devi estrarre e reinserire la SD, poichè avvien un unmount automatico ogni fine scrittura.

Tutto diepnde da cosa vuoi fare, se hai un "buffer" che ti permette di scaricare raramente quanto avere una SD sempre monetata ti do ragione :slight_smile:

lesto:
Col tuo sistema ogni ora devi estrarre e reinserire la SD, poichè avvien un unmount automatico ogni fine scrittura.

Chi ha parlato di "umount" automatico ??? :astonished: :astonished: :astonished:

Ho chiaramente scritto : "... una volta che gli dici che vuoi estrarre la SD (... perché in qualche modo, se vuoi fare una cosa sicura, glie lo dovrai dire) il SW fa l'"umount"" ...
... nulla di automatico ... ma controllato dal SW si. Tu .. che ne so, pigi un bottone e gli dici che vuoi estrarre la SD ... a quel punto la cosa è gestita dal SW e, solo a quel punto, se non la estrai e non la reinserisci, non la usi più :wink:

Guglielmo