2017-04-05 2 views
0

J'ai travaillé sur un prototype Arduino (ATMega328p) qui doit enregistrer des données lors de certains événements. Un capteur LSM6DS33 est utilisé pour générer 6 valeurs (2 octets chacune) à une fréquence d'échantillonnage de 104 Hz. Ces données doivent être enregistrées pour une période de 500-20000ms.Comment empêcher la carte SD de créer des retards d'écriture pendant la journalisation?

Dans mon code, je génère une interruption toutes les 1/104 sec en utilisant Timer1. Lorsque cette interruption se produit, les données sont lues à partir du capteur, étalonnées puis écrites sur une carte SD. Normalement, ce n'est pas un problème. La lecture des données du capteur prend ~ 3350us, l'étalonnage ~ 5us et l'écriture ~ 550us. Cela signifie qu'un cycle total prend ~ 4000us, alors que 9615us est disponible.

Afin d'économiser de l'énergie, je souhaite abaisser la tension à 3.3V. Selon la fiche technique Atmel, cela signifie également que la fréquence d'horloge doit être abaissée à 8 MHz. En supposant que tout ira deux fois plus lentement, un cycle de mesure serait encore possible car ~ 8000us < 9615us. Après quelques tests (encore 5V @ 16MHz), cependant, il m'arrivait que de temps en temps, un cycle d'écriture prend ~ 1880us au lieu de ~ 550us. J'utilise la bibliothèque SdFat pour écrire et tester des cartes SD (exemple RawWrite). Les résultats suivants sont venus quand je l'ai testé la carte:

Début écriture brute de 100000 KB
Taux cible: 100 KB/sec
temps Cible: 100 secondes
bloc min écriture temps: 1244 micro-ordinateurs
bloc Max temps d'écriture: 12324 micros
Temps d'écriture de bloc moyen: 1247 micros

Comme on le voit, le temps moyen d'écriture est assez constant, mais parfois une durée maximale de 10x se produit! Selon l'auteur de la bibliothèque, c'est parce que la carte SD a besoin de cycles d'effacement entre x nombre de cycles d'écriture. Cela provoque un délai d'écriture (src:post#18&#22). Ce délai, cependant, repousse le temps nécessaire pour un cycle hors du support 9615us disponible, car le cycle de mesure total serait de 10672us.

Les données que je suis en train d'écrire, est tout d'abord mis en une chaîne en utilisant sprintf:

char buf[20] = ""; 
sprintf(buf,"%li\t%li\t%li\t%li\t%li\t%li",rawData[0],rawData[1],rawData[2],rawData[3],rawData[4],rawData[5]); 
myLog.println(buf); 

Ce écrit les données dans un fichier txt. Mais à ma vitesse, seulement 21 * 104 = 2184 B/s suffiraient. La réduction de la vitesse de l'exemple RawWrite à 6 Ko/s entraîne l'écriture de la carte SD sans délai d'écriture étendu. Pourtant, mon code les a toujours, même si moins de données sont écrites.

Ma question est: comment puis-je empêcher ce retard (si possible)? Et si ce n'est pas possible, comment puis-je contourner ce problème? Cela aiderait si je comprenais pourquoi exactement le retard se produit, parce que l'intervalle n'est pas toujours le même (toutes les 10-15 écritures).

Quelques informations supplémentaires:
L'esquisse utilise actuellement 69% de RAM (2 Ko) avec des variables. Créer deux buffers de 512 octets - comme suggéré dans le même forum - n'est pas possible pour moi.
Initialement, j'ai utilisé deux chaînes. Les fusionner en un, n'affectait pas la vitesse d'écriture avec n'importe quelle signification.

+1

Le délai d'effacement est inhérent à la carte SD. S'il est plein, vous pouvez vous attendre à des délais encore plus longs. De plus, si les cellules vieillissent, elles prennent plus de temps pour écrire. Bien que votre question soit trop large (nous ne sommes pas un site de conseil), la mise en mémoire tampon peut aider, mais comme vous dites que votre RAM est à la limite, Arduino (au moins la base ATmega) n'est peut-être pas une plateforme appropriée. Enfin: Arduino n'est pas ** C. Ne pas spammer les tags. – Olaf

+0

Si les performances sont importantes, pourquoi convertissez-vous les valeurs en une chaîne et en écrivant du texte? Cela prend plus de place et plus de temps. –

+0

@AndrewHenle: Même si je suis d'accord c'est une mauvaise idée d'utiliser 'printf' etc sur une si petite plate-forme, il ne semble pas être le problème majeur. Cela n'évitera pas les décrochages de la carte SD. – Olaf

Répondre

0

Je ne sais pas comment contourner le retard, mais je ressens une plus stable et plus rapide temps d'écriture, si je l'ai écrit dans un fichier binaire au lieu d'un fichier « .csv » ou txt ».

Le lien suivant fournit un bon script pour écrire des données en tant que structure binaire sur la carte SD.(Il y a une petite faute de frappe dans son exemple, il est facilement corrigé) https://hackingmajenkoblog.wordpress.com/2016/03/25/fast-efficient-data-storage-on-an-arduino/

Cela ne vous aidera pas à la variation du temps, mais il pourrait réduire le temps d'écriture et negleting ainsi la question du temps.