Comment protéger la carte SD contre les pannes de courant inattendues?

18

Je travaille sur un appareil qui utilise la bibliothèque Microchip MDDFS pour stocker des données sur une carte SD. L'enregistreur enregistrera les données à un taux maximum de 1 entrée (56 octets) chaque minute. Le problème est que le périphérique peut perdre de l'énergie à tout moment, potentiellement au milieu d'une séquence d'écriture. Je me demande quelle est la meilleure façon de protéger mes données contre la corruption. J'ai constaté que si le fichier est ouvert lorsque l'alimentation est coupée, toutes les données qui ont été écrites dans le fichier après la dernière fermeture de fichier sont perdues. Je ne sais pas s'il en va de même en cas de perte de puissance au milieu de la séquence d'écriture.

Étant donné que la procédure d'écriture ne se produit pas très fréquemment, je pourrais ouvrir le fichier, écrire les données, puis fermer le fichier, chaque fois que les données sont enregistrées. Cette approche endommagerait-elle la carte SD au fil du temps?

Une autre approche pourrait être de garder le fichier ouvert, mais après chaque 10 ou 50 écritures, je pourrais fermer le fichier, puis le rouvrir.

Je pourrais également mettre les données en mémoire tampon, puis vider les données de temps en temps, peut-être après un kilo-octet.

La dernière idée que j'ai eue était, dans mon circuit, je pouvais ajouter un grand condensateur qui alimenterait ma carte pic / sd assez longtemps après la coupure de l'alimentation pour fermer rapidement le fichier. Le problème avec cette approche est que le temps nécessaire pour fermer le fichier et / ou enregistrer les données est très incohérent. D'après ma compréhension, cette fois peut très dépendre de la place actuelle dans une page flash dans laquelle se trouve le fichier.

Quoi qu'il en soit, que suggéreriez-vous?

PICyourBrain
la source
2
Si vous êtes passé au flash NAND brut avec un système de fichiers minimal, vous pouvez explorer plusieurs des couches d'abstraction qui entravent actuellement votre capacité à valider de petites écritures, et probablement gagner la possibilité d'effectuer des écritures de bloc partielles immédiatement lorsque les données seront disponibles. Vous auriez également une protection contre un utilisateur final remplaçant une carte avec des détails de performances différents (peut-être même une carte grise marginale) en cours de route.
Chris Stratton

Réponses:

16

Plusieurs choses peuvent se produire lorsque vous écrivez des données dans un fichier. Je vais décrire la séquence qui doit se produire pour que les données soient sûres, pas nécessairement les appels de bibliothèque.

Lorsque vous écrivez et ajoutez à la fin du fichier (mode d'écriture normal), vous lisez le dernier bloc du fichier en mémoire, le modifiez avec vos données d'écriture, puis réécrivez le bloc entier sur la carte SD . Si le bloc est plein, un nouveau bloc doit être trouvé dans la table d'allocation de fichiers (FAT). Après avoir trouvé un nouveau bloc, le FAT doit être mis à jour, qui est un cycle lecture-modification-écriture. Si nous avons terminé avec le fichier, nous devons mettre à jour les attributs de fichier (tels que la longueur du fichier) dans le répertoire racine, ce qui provoque un autre cycle de lecture-modification-écriture.

Minimiser votre temps d'écriture

  • Assurez-vous que le fichier contient déjà vos données lorsque vous écrivez un secteur. Si vous commencez avec un fichier volumineux et écrasez les données au lieu d'ajouter les données, les données seront en sécurité dès que l'écriture du secteur de la carte SD est terminée. Vous pouvez ainsi éliminer un à deux cycles de lecture-modification-écriture. Mon code de démarrage écrivait des 0 dans un fichier par incréments de secteur jusqu'à ce que la carte SD soit pleine, puis rembobinait au début du fichier.

  • Ajustez la taille de vos entrées de données de sorte qu'un nombre entier d'entrées tienne dans un secteur. Je voudrais augmenter vos entrées à 64 octets. Bien que cela soit moins efficace, cela vous évitera de devoir lire-modifier-écrire deux secteurs.

  • Créez une variante de la fonction FSwrite qui vous permet d'écrire des secteurs entiers. Si vous conservez tout le secteur dans SRAM, votre cycle passe de "lecture-modification-écriture" à "modification-écriture"

Gardez votre PIC et SD sous tension aussi longtemps que possible

  • Les gros condensateurs sont bons. 470uF devrait vous donner plus que suffisamment de puissance pour terminer un cycle d'écriture.

  • Assurez-vous que votre source d'alimentation n'aspire pas l'énergie de votre condensateur de secours! Ajoutez une diode si nécessaire.

Sachez quand vous n'êtes plus au pouvoir

  • Un gros bouchon d'alimentation vous donnera 10 ms ou plus pour envelopper les choses avec une carte SD, mais ne appuyez pas sur votre chance. Utilisez une épingle sur votre microcontrôleur pour voir si votre source d'alimentation est toujours bonne et ne commencez pas à écrire si votre source est morte.
W5VO
la source
Merci pour l'info. Très utile. Je vais voir ce que je peux en faire ...
PICyourBrain
Combien de temps pensez-vous qu'il faudrait pour écrire tous les zéros sur une carte de 4 Go? Cela semble long. De plus, avez-vous des exemples de code que vous pourriez partager pour modifier la fonction fswrite pour permettre des écritures entières sur des secteurs entiers?
PICyourBrain
Aussi, si vous écrivez tous les zéro dans le fichier. Comment gardez-vous une trace de la fin de vos données réelles? Vous venez de lire toutes les données au début et de trouver la chaîne de zéros?
PICyourBrain
1
Si vous utilisez FAT16, je pense que vous êtes limité à 2 Go. Je crois que la carte SD / MMC a une fonction "effacer les blocs", qui ne semble pas être implémentée dans la bibliothèque MDDFS. J'ai utilisé une bibliothèque de codes propriétaire pour mon projet de carte SD, donc je ne peux partager aucun exemple de code. Afin de trouver les dernières données, vous devez lire jusqu'à ce que vous trouviez tous les 0 dans un enregistrement de données. Si votre enregistrement de données peut être composé de 0, je vous conseille d'ajouter des données non nulles ou un délimiteur de certaines sortes.
W5VO
6

Un problème non encore mentionné avec les cartes SD (ou MMC, CompactFlash, etc.) est que même si une carte SD peut apparaître à l'hôte comme une simple collection de secteurs de 512 octets qui peuvent être lus et écrits dans un ordre arbitraire, les périphériques flash en général stocker des pages de 528 octets dans des groupes de 32 Ko sinon plus chacun, et les seules opérations prises en charge consistent soit à écrire sur une page autrement vierge, soit à effacer un groupe entier. Pour faire face à cette limitation, le contrôleur sur une carte SD conservera une table qui permettra de mapper n'importe quel secteur logique sur n'importe quelle page physique. Lorsqu'une demande est faite pour écrire un secteur, le contrôleur trouvera une page vierge quelque part sur la puce et mettra à jour le mappage avec la nouvelle adresse du secteur en question. Si les pages blanches deviennent rares, ou à d'autres moments,

L'importance de cela est que l'acte d'écrire dans un secteur logique particulier peut nécessiter un brassage autour des données de nombreux secteurs logiques. Si quelque chose se passe mal dans ce processus, cela pourrait entraîner la corruption de tout secteur arbitraire - pas seulement le secteur que la carte a été invitée à écrire. Un bon contrôleur de carte SD doit être conçu pour effectuer les opérations de brassage de données de telle sorte que si l'alimentation est perdue pendant un brassage de données, il sera en mesure de déterminer quelles parties de l'opération se sont terminées et lesquelles ne l'ont pas été, et par conséquent être en mesure de terminer correctement l'opération. Malheureusement, je n'ai aucune idée de comment on peut dire si la carte SD de 5 $ récupérée dans un magasin de rabais sera bonne à cet égard.

Pour être sûr, même si une carte SD est absolument parfaite du point de vue de garantir que chaque opération d'écriture qui a été signalée comme terminée, survivra en fait à une panne de courant (c'est-à-dire en garantissant que tout le travail soit écrit ou non) aurait causé est terminée, suffisamment de tâches sont terminées pour que la carte termine l'opération lorsque l'alimentation est rétablie), ce qui ne signifie pas que le système d'exploitation hôte n'aura aucun problème s'il effectue certaines, mais pas toutes, les écritures de données qu'il prévoit. Néanmoins, il est important de garder à l'esprit que si la carte SD ne peut pas respecter sa fin du "marché", il n'y a rien qui puisse être fait sur le logiciel côté hôte pour éviter la perte de données en cas de panne de courant.

supercat
la source
C'est un commentaire très perspicace.
fred basset
5

Je suggère également d'utiliser une sorte de somme de contrôle pour vérifier que les données sur le SD sont correctes chaque fois qu'elles doivent être lues.

sybreon
la source
3

Peut - être que ce supercondensateur de Sparkfun résoudrait le problème.

pingswept
la source
2
Il contiendrait la mémoire du PIC, mais il a une intensité nominale maximale de 10uA. Je ne pense pas que vous pourriez écrire sur une carte SD avec autant de courant.
W5VO
1
Mais le concept est bon. Une recherche rapide a révélé que l'Illinois Capacitor ( illinoiscapacitor.com ) a un supercondensateur jusqu'à 8 F et capable de supporter des courants jusqu'à 4 A. L'ajout de l'un d'eux, ou d'une batterie, donnerait au micro une chance de terminer une écriture et d'arrêter les choses. bien si la source d'alimentation principale tombe en panne.
The Photon
3

Étant donné que la procédure d'écriture ne se produit pas très fréquemment, je pourrais ouvrir le fichier, écrire les données, puis fermer le fichier, chaque fois que les données sont enregistrées. Cette approche endommagerait-elle la carte SD au fil du temps?

Comme pour tout problème d'ingénierie, vous devrez traiter les compromis ici.

Est-il essentiel de ne perdre aucune donnée? Ensuite, je ferais ce qui précède. Vous auriez plus de dégâts en perdant les données qu'en ruinant une carte. Vous voudrez peut-être faire un test de résistance, en quelque sorte, pour déterminer combien de fois vous pourriez effectuer cette opération avant que la carte ne soit corrompue. Si vous êtes cool avec le temps qu'il a fallu avant que la carte ne devienne inutilisable, et il semble que ce soit un temps acceptable avant de changer la carte, je choisirais cette voie.

J. Polfer
la source
1

Si vous souhaitez simplement stocker des données, vous n'avez pas besoin d'un système de fichiers. l'opération d'écriture se fera directement sur le SPI en sélectionnant l'adresse du bloc. en faisant cela, vous réduisez le temps d'écriture et vous le risque de corruption de données.

Même en cas de panne de courant et de malchance, vous ne perdrez qu'une seule entrée (ce qui peut être acceptable sur certains systèmes).

mba7
la source