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?
Réponses:
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
la source
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.
la source
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.
la source
Peut - être que ce supercondensateur de Sparkfun résoudrait le problème.
la source
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.
la source
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).
la source