Per "il più veloce possibile", vorrei
- Riscrivere il codice di campionamento in linguaggio assembly (solo quelle due istruzioni, non l'intero programma); e
- Memorizza nel buffer le coppie di dati grezzi se ne hai abbastanza, quindi memorizzale sulla scheda dopo il burst di misurazione. Se hai bisogno di più spazio per i dati, considera che la tempistica di un ciclo di assemblaggio stretto sarà coerente (e veloce!) E può essere misurata. Potrebbe non essere necessario leggere l'orologio. Nota che puoi ottenere la stessa coerenza temporale usando C / C ++ se leggi direttamente le porte analogiche e di clock, e forse altrettanto velocemente. È solo che con il linguaggio assembly, WYWIWYG (ciò che scrivi è ciò che ottieni); i generatori di codice e gli ottimizzatori dei compilatori non lo mancheranno.
Un possibile problema con il tuo codice mentre lo hai scritto è che writeData probabilmente memorizza i dati nella maggior parte delle chiamate, ma ogni volta che una chiamata risulta in un buffer pieno, scrive l'intero buffer sulla scheda, introducendo jitter nel campionamento.
Facendo riferimento alla tua modifica del 3 giugno 2014, "vorrei registrare l'ora esatta in cui I dati di analogRead sono stati raccolti ":
Dato che hai proposto di utilizzare micros () (al contrario di un orologio in tempo reale), presumo che tu sia soddisfatto del tempo relativo. Una volta che sai che il tuo codice di raccolta dati è completamente prevedibile, lo scostamento tra la lettura dei dati e il tempo di lettura è costante e, poiché stiamo comunque utilizzando il tempo relativo, può essere scontato o almeno corretto.
Ovviamente non è completamente prevedibile, poiché in questo caso stai usando un orologio mantenuto da interruzioni e puoi aspettarti che a volte l'interruzione si verifichi tra i dati letti e l'orologio read, allungando l'offset per quella tupla. Per essere ancora più accurati, dovresti tenere fuori gli interrupt, leggere tu stesso il timer in modo invariante. f / ex, potresti eseguire il timer a una velocità tale da aspettarti di prendere due o più campioni tra gli overflow del byte di ordine inferiore, leggere e memorizzare solo il byte di ordine inferiore come campione di tempo e postelaborare il tempo dati per ricostruire il byte di ordine elevato rilevando il wrap-around nell'ordine inferiore.
Senza interruzioni in esecuzione e una volta che si conosce la velocità con cui è possibile campionare i dati senza leggere l'orologio, è possibile leggere e salva l'orologio una volta immediatamente prima di prendere il primo campione e deduci i tempi di ogni campione successivo in base alla frequenza di campionamento nota.