Domanda

In un'applicazione embedded Linux che sto sviluppando, è necessario registrare alcuni eventi che si verificano di volta in volta. Questi record vengono salvati su un dispositivo flash MTD e, una volta scritti, non è necessario modificarli o effettuare ricerche efficienti, ma è necessario l'accesso in lettura per mostrare i dati all'utente. Un grosso problema è che l'alimentazione può andare via in qualsiasi momento, senza una corretta sequenza di spegnimento. La frequenza con cui si verificano questi eventi può essere molto lenta (giorni / settimane), ma molti di questi si verificheranno contemporaneamente. I dati da salvare per ogni evento sono fortemente tipizzati: data, ora, un paio di stringhe di testo brevi e diversi numeri interi.

Attualmente ho ereditato una soluzione basata su jffs2 e SQLite che è tutt'altro che ottimale perché il file DB a volte viene danneggiato. Quando ciò accade, l'intero file diventa illeggibile e non c'è modo di capire se è stato causato da un bug in jffs2, o in SQLite o se il settore flash era danneggiato o se la potenza è stata interrotta al momento sbagliato.

Esiste una libreria o una combinazione di filesystem / libreria che può aiutarmi a risolvere meglio questo tipo di problema? O dovrei semplicemente usare un file di testo in formato CSV?

È stato utile?

Soluzione

Stiamo usando un vecchio syslogd normale su una partizione YAFFS2 su NAND flash, sembra funzionare bene: quando i messaggi vengono inviati al logger e l'alimentazione viene rimossa immediatamente dopo (< 100ms) il messaggio è lì e il il registro non sembra mai corrotto.

Questo si basa sull'osservazione piuttosto che sulla mia conoscenza esplicita che tutto sarà sempre coerente per design, mente.

Altri suggerimenti

Non sono esperto di sistemi incorporati, ma penso che un CSV sarebbe probabilmente il migliore. Fondamentalmente non può essere danneggiato, o se lo fa, allora puoi facilmente vedere l'errore e risolverlo manualmente (nuova riga o semplicemente rimuovendo una riga). Ho lavorato per ricevere i dati da un sistema incorporato in cui hanno molti problemi di corruzione (in parte sul sistema e in parte durante il trasferimento della linea telefonica). Sarebbe molto utile se fosse in un formato di tipo CSV in modo da poter trovare gli errori e rimuoverli o correggerli invece di corrompere l'intero set di dati.

Se non hai bisogno di cercare all'interno del sistema, un CSV funziona perfettamente.

Esistono numerosi file system incorporati (non compatibili con fat) progettati esattamente per questo scopo. Non posso suggerire poiché non ne ho mai usato uno, ma qui qualcosa da Google. Sono sicuro che puoi scavare di più, e spero che qualcuno qui possa fornire maggiori informazioni, potrebbe esserci qualcosa basato su GPL. Il confronto tra diversi file system è qui

Due file CSV / di testo. Avvia una nuova coppia ogni volta che il sistema si riavvia. Scrivi ogni evento nel primo file, scarica il file da archiviare, scrivi il record nel secondo file, quindi scarica di nuovo.

In questo modo, se si verifica un arresto anomalo durante la prima scrittura, tutti i dati nella seconda copia (fino a quella scrittura) saranno ancora lì.

Assicurati che il flush sia un flush completo del file system e non solo il flush del buffer clib.

Forse anche posizionare i file su file system separati. Riservare spazio prima di ciò di cui hai bisogno potrebbe anche contribuire ad accelerare il processo.

Quali servizi sono disponibili per te? L'opzione migliore è spesso accedere a una risorsa esterna, ad esempio tramite syslog, SNMP, raw socket o porta seriale. Questo ti protegge dai log spiacevoli sul dispositivo stesso.

Se è necessario archiviare i log internamente, ho trovato che i file in chiaro e leggibili dall'uomo sono l'opzione migliore nei dispositivi incorporati. Il & Quot; write / flush & Quot; il ciclo è veloce, non sono necessari strumenti per mantenerli e puoi monitorarli in tempo reale. Se la dimensione del file è un problema, è possibile eseguire il timestamp con un numero intero anziché un testo formattato e utilizzare un & Quot; ID evento & Quot; per abbreviare ogni registro (lasciare solo i dati specifici dell'istanza come testo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top