Domanda

In un ambiente incorporato (utilizzando MSP430), ho visto qualche corruzione dei dati causata da scritture parziali alla memoria non volatile.Ciò sembra essere causato dalla perdita di potenza durante una scrittura (a segmenti di fram o info).

Sto convalidando i dati memorizzati in queste posizioni con un CRC.

La mia domanda è, qual è il modo corretto per prevenire questa corruzione "scrittura parziale"?Attualmente, ho modificato il mio codice per scrivere a due località separate di fram.Quindi, se una scrittura viene interrotta, causando un CRC non valido, l'altra posizione dovrebbe rimanere valida.È una pratica comune?Devo implementare questo comportamento di doppia scrittura per qualsiasi memoria non volatile?

È stato utile?

Soluzione

Una soluzione semplice è quella di mantenere le versioni due dei dati (in pagine separate per la memoria flash), la versione corrente e la versione precedente. Ogni versione ha un'intestazione comprendente un numero di sequenza e una parola che convalida il numero di sequenza - semplicemente il complemento 1 del numero di sequenza ad esempio:

---------
|  seq  |
---------
| ~seq  |
---------
|       |
| data  |
|       |
---------
.

La cosa critica è che quando i dati vengono scritti le parole seq e le parole ~seq sono scritte ultima .

A Start-up You Leggi i dati che hanno il numero più alto sequenza (contabilità per wrap-around forse - specialmente per le parole di sequenza brevi). Quando scrivi i dati, sovrascrivi e convalida il blocco più vecchio .

La soluzione che stai già utilizzando è valida fintanto che il CRC è scritto per ultimo, ma manca di semplicità e impone un calcolo CRC in alto che potrebbe non essere necessario o desiderabile.

On Fram non hai preoccupazione per la resistenza, ma questo è un problema per la memoria flash e la EEPROM. In questo caso, utilizzo un metodo della cache di scrittura, in cui i dati vengono mantenuti in RAM, e quando viene avviato un timer modificato o riavviato se è già in esecuzione - Quando il timer scade, i dati sono scritti - questo impedisce scritture a scansione Dal thrashing della memoria ed è utile anche su FRAB in quanto riduce al minimo il sovraccarico del software di scrittura dei dati.

Altri suggerimenti

Il nostro team di ingegneria prende un approccio a due punte a questi problemi: risolverlo in hardware e software!

Il primo è un accordo di diodo e condensatore per fornire alcuni millisecondi di potenza durante un Brown-out. Se notiamo che abbiamo perso la potenza esterna, impediamo che il codice entri da scritture non violate.

In secondo luogo, i nostri dati sono particolarmente critici per il funzionamento, aggiorna spesso e non vogliamo indossare la nostra memoria flash non violata (supporta solo così tante scritture.) Quindi in realtà memorizziamo i dati 16 volte in flash e proteggere ogni record con un codice CRC. All'avvio, troviamo la nuova scrittura valida e quindi avvia i nostri cicli di cancellazione / scrittura.

Non abbiamo mai visto la corruzione dei dati dall'attuazione del nostro sistema francamente paranoico.

Aggiornamento:

Dovrei notare che il nostro flash è esterno alla nostra CPU, quindi il CRC aiuta a convalida i dati se c'è un problema tecnico di comunicazione tra la CPU e il chip flash. Inoltre, se sperimentiamo diversi problemi di riga, le scritture multiple proteggono contro la perdita di dati.

Abbiamo usato qualcosa di simile alla risposta di Clifford ma scritto in un'unica operazione di scrittura.Hai bisogno di due copie dei dati e si alternano tra di loro.Utilizzare un numero di sequenza di incrementazione in modo che in modo efficace una posizione abbia anche numeri di sequenza e uno ha strano.

Scrivi i dati come questo (in un comando di scrittura se è possibile):

---------
|  seq  |
---------
|       |
| data  |
|       |
---------
| seq   |
---------
.

Quando la leggi indietro Accertarsi che entrambi i numeri di sequenza siano gli stessi - se non sono quindi i dati non validi.All'avvio leggi entrambe le posizioni e funzionano quale è più recente (tenendo conto del numero di sequenza che rotola).

Memorizza sempre i dati in un tipo di protocollo, come Start_Byte, byte totali per scrivere, dati, fine byte. Prima di scrittura alla memoria esterna / interna controllare sempre i registri del monitore di potenza / ADC. Se comunque, i tuoi dati corrono, anche il byte finale corromperà.In modo tale che l'immissione non sarà VAILD dopo la convalida di un intero protocollo. Il checksum non è una buona idea, puoi scegliere CRC16 invece che se vuoi includere CRC nel tuo protocollo.

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