2008-10-05 18 views
3

Dans une application intégrée Linux que je développe, il est nécessaire d'enregistrer certains événements qui se produisent de temps en temps. Ces enregistrements sont enregistrés sur un périphérique Flash MTD et, une fois écrits, il n'est pas nécessaire de les modifier ou de faire des recherches efficaces, mais un accès en lecture est requis pour montrer les données à l'utilisateur. Un gros problème est que la puissance peut disparaître à tout moment, sans une séquence d'arrêt appropriée. La fréquence de ces événements peut être très lente (jours/semaines), mais plusieurs d'entre eux se produiront en même temps. Les données à enregistrer pour chaque événement sont fortement typées: date, heure, quelques chaînes de texte courtes et plusieurs entiers.Enregistrement de données de type Blackbox

Actuellement, j'ai hérité d'une solution basée sur jffs2 et SQLite qui est loin d'être optimale car le fichier DB est parfois corrompu. Quand cela arrive, le fichier entier devient illisible et il n'y a aucun moyen de comprendre s'il a été causé par un bogue dans jffs2, ou dans SQLite ou si le secteur flash était mauvais, ou si l'alimentation a été coupée au mauvais moment.

Y at-il une bibliothèque ou une combinaison de système de fichiers/bibliothèque qui peut mieux m'aider à résoudre ce genre de problème? Ou devrais-je simplement utiliser un fichier texte au format CSV?

Répondre

1

Nous utilisons un ancien syslogd à une partition YAFFS2 sur NAND flash, il semble bien fonctionner: lorsque les messages sont envoyés à l'enregistreur et l'alimentation est supprimée immédiatement après (< 100ms) le message est là et le journal n'apparaît jamais corrompre.

Ceci est basé sur l'observation plutôt que de dire explicitement que tout sera toujours cohérent par le design, l'esprit.

3

Je ne suis pas expert sur les systèmes embarqués, mais je pense qu'un CSV serait probablement le meilleur. Il ne peut fondamentalement pas être corrompu, ou si c'est le cas, alors vous pouvez facilement voir l'erreur et la corriger manuellement (nouvelle ligne ou simplement en supprimant une ligne). J'ai travaillé sur la réception des données d'un système embarqué où ils ont beaucoup de problèmes de corruption (partiellement sur le système et partiellement pendant le transfert de la ligne téléphonique). Il serait très utile que ce soit dans un format de type CSV afin que nous puissions trouver les erreurs et les supprimer ou les corriger au lieu de corrompre l'ensemble des données.

Si vous n'avez pas besoin de rechercher dans le système, un fichier CSV fonctionne parfaitement.

1

Il existe un certain nombre de systèmes de fichiers embarqués (non compatibles avec les matières grasses) conçus à cette fin. Je ne peux pas suggérer puisque jamais utilisé un, mais here quelque chose de google. Je suis sûr que vous pouvez creuser plus, et j'espère que quelqu'un ici peut fournir plus d'informations, peut-être il ya quelque chose basé sur la GPL. La comparaison des différents systèmes de fichiers est here

0

Deux fichiers CSV/texte. Commencez une nouvelle paire chaque fois que le système redémarre. Ecrire chaque événement dans le premier fichier, vider le fichier à stocker, écrire l'enregistrement dans le deuxième fichier, puis vider à nouveau. De cette façon, si vous vous plantez lors de la première écriture, toutes les données de la deuxième copie (jusqu'à ce que vous écriviez) seront toujours présentes.

Assurez-vous que le vidage est un vidage complet du système de fichiers et pas seulement le vidage du tampon de clivage. Peut également placer les fichiers sur des systèmes de fichiers distincts. Réserver de l'espace en amont de ce dont vous avez besoin pourrait également accélérer le processus.

0

De quelles installations disposez-vous? La meilleure option est souvent de connecter à une ressource externe, par exemple via syslog, SNMP, socket brut ou port série. Cela protège les journaux des désagréments de l'appareil lui-même.

Si vous avez besoin de stocker des journaux en interne, j'ai trouvé que les fichiers lisibles en texte clair sont la meilleure option dans les périphériques intégrés. Le cycle "écriture/vidage" est rapide, aucun outil n'est nécessaire pour les maintenir et vous pouvez les surveiller en temps réel. Si la taille du fichier est un problème, vous pouvez horodater avec un entier plutôt que du texte formaté et vous pouvez utiliser un "ID d'événement" numérique pour abréger chaque journal (ne conserver que les données spécifiques à l'instance sous forme de texte).