Guardando la libreria per la lettura delle SD mi sono imbattuto nella libreria SdFat che i sembra moooooooooooooooooooooooooooooooolto più completa di quella standard, ma al contempo un po' più complicata.
La domanda è questa: come posso effettuare inserimenti e disinserimenti della SD a caldo fermo restando i rischi di corrompere il filesystem se estraggo la SD durante la scrittura). Come riesco a capire se la SD è inserita (all'avvio) e se è ancora inserita (dopo averla inserita)?
Inoltre vorrei avere lumi sul funzionamento della libreria perché effettivamente è mooooolto grande e abbastanza complessa.
1°: Montare il volume inizializzando la classe Sd2Card con la funzione Sd2Card::init(xxx)
1bis: Verificare se ci sono stati errori, ad esempio SD non inserita
2: Montare la partizione inizializzando la classe SdVolume con la funzione SdVolume::init(xxx)
3: Navigare nelle directory con la classe SdFile o aprirli/chiuderli rispettivamente con gli fstream
Mi sono perso qualcosa?
Durante i punti 2-3 come riesco a capire se la SD mi è stata estratta?
bufferizzi i dati più possibile in ram.. tanto al massimo se si resetta arduino perdi qualche secondo in più di dati, che al confronto con perdere TUTTI i dati...
magari quando usi la SD accendi pure un led, così sai quando puoi/non puoi estrarre la SD
Non mi pare. Però puoi fare un'operazione semplice sulla SD e vedere se la scheda c'è in base al fatto se ricevi un errore o no. Ad esempio cambiare la dir.
Fino a che non inserisco la SD non vedo arrivare niente e dopo mi vedo arrivare gli "0", come mi aspetto. Perché prima di inserire la SD non mi vedo arrivare niente?
EDIT: Forse perché anche la Serial.println lavora a interrupt?
Anche la gestione della seriale è basata su interrupt. Però si affida ad un buffer dove vengono messi i byte da essere spediti oppure prelevati quelli già letti. Solitamente, un task del leOS deve compiere un lavoro non oneroso in termini di risorse, altrimenti blocca ogni cosa. L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.
leo72:
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.
Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto...
EDIT:
Ho visto che non sono includibili insieme... =( Mi dice che ONETIME è già stato definito...
leo72:
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.
Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto...
EDIT:
Ho visto che non sono includibili insieme... =( Mi dice che ONETIME è già stato definito...
Che io sappia molti socket x le sd hanno anche un microswitch che dice se sono inserite o no...
leo72:
... L'attesa dell'inserimento di una SD è una di quelle cose da NON mettere in un task: blocchi tutto il micro finché non viene inserita la scheda.
Girando i rete cercavo uno scheduler SW basato su millis giusto per fare quella cosa e guarda cosa mi è venuto fuori: looper... Mi potevi dire che avevi fatto anche quello? Sei troppo modesto...
EDIT:
Ho visto che non sono includibili insieme... =( Mi dice che ONETIME è già stato definito...
Purtroppo no, il looper è stato scritto per sostituire il leOS.
Però col looper puoi fare cose simili a quelle permesse dal leOS, l'unica differenza principale è che col looper non hai più la certezza assoluta dell'esecuzione del task ad intervalli esatti. Ma se si parla di intervalli di centinaia o migliaia di millisecondi (come nel tuo caso) la cosa è irrilevante.
Janos:
Non è che esiste una funzione (che magari mi è sfuggita) per testare se la SD è ancora presente?
Avevo fatto questo un po' di tempo fa, se tu controllassi gli stati di tutti i pin in tempo reale ti accorgeresti che quando estrai la SD alcuni pin che riguardano l'impegno dello shield e della SD cambiano di stato
Ho creato un controllo e un ripristino automatico nel caso venisse rimossa e reinserita la schedina, il tutto funzionava bene, ma ho ritenuto inuitile tale funzione dato che ......."Perchè mai dovresti rimuovere la sd mentre il sistema è in funzione?" XD
Soprattutto se rimuovi la scheda mentre è in lettura non succede nulla la spi si inchioda e va reinizializzata (poco male), ma se la rimuovi mentre è in scrittura la situazione diventa grave, comprometti i settori di inizializzazione e il file system, tutti i dati saranno perduti e va riformattata
L'idea di lesto del led da accendere quando la SD è in uso non è da scartare. Anzi, avverte visivamente l'utente di non rimuovere la scheda pena danni ai propri dati.
Arduino si accorge che hai tolto la scheda immediatamente, ma non si accorge quando la rimetti .... reinserendola non funziona più a meno che ogni n secondi non gli fai fare il controllo e reinizializzare la stessa, vale la pena fargli perdere questo tempo?
pablos:
Arduino si accorge che hai tolto la scheda immediatamente, ma non si accorge quando la rimetti .... reinserendola non funziona più a meno che ogni n secondi non gli fai fare il controllo e reinizializzare la stessa, vale la pena fargli perdere questo tempo?