2009-11-18 12 views
5

Sto provando a sviluppare una struttura della cronologia degli allarmi da memorizzare nella memoria flash non volatile. La memoria flash ha un numero limitato di cicli di scrittura, quindi ho bisogno di un modo per aggiungere record alla struttura senza dover riscrivere tutte le pagine flash nella struttura ogni volta o scrivere i puntatori aggiornati sulla coda/coda della coda.Stack o coda della cronologia degli allarmi?

Inoltre, una volta che è stato utilizzato lo spazio di memoria flash disponibile, desidero iniziare a sovrascrivere i record precedentemente memorizzati in flash a partire dal primo record aggiunto first-in-first-out. Questo mi fa pensare che un buffer circolare funzionerebbe al meglio per aggiungere elementi. Tuttavia, quando visualizzo i record, voglio che la struttura funzioni come una pila. Per esempio. I record verrebbero visualizzati in ordine cronologico inverso last-in-first-out.

Dimensioni della struttura, testa, coda, indici non possono essere memorizzati a meno che non siano memorizzati nel record stesso poiché se fossero scritti ogni volta in una posizione fissa, eccederebbero i cicli di scrittura massimi nella pagina in cui erano memorizzati .

Quindi dovrei usare uno stack, una coda o una struttura ibrida? Come devo memorizzare la testa, la coda, le informazioni sulla dimensione in flash in modo che possa essere reinizializzata dopo l'accensione?

+0

Stai lavorando direttamente su flash o stai utilizzando un file system su flash? – stefaanv

+0

Nessun file system. Scrivere direttamente in flash. – mjh2007

risposta

4

Lookup ring-buffer

Supponendo che si può lavorare fuori che è l'ultima voce (da un time stamp ecc quindi non hanno bisogno di scrivere un marker) anche questo ha le migliori prestazioni di usura di livellamento.

2

Modifica: non applicabile al controller flash dell'OP: Non dovresti preoccuparti di wear leveling nel tuo codice. Il controller della memoria flash dovrebbe gestire questo dietro le quinte.

Tuttavia, se si desidera continuare a farlo, utilizzare solo un buffer circolare regolare e keep pointers to the head and tail dello stack.

Si potrebbe anche prendere in considerazione l'utilizzo di un Least Recently Used cache per gestire la posizione in cui è necessario archiviare i dati.

+0

Non è esattamente il livellamento dell'usura. Deve concentrarsi sulla scrittura il minor numero possibile di volte. –

+0

Sono abbastanza sicuro che il controller di memoria flash non fornisca il livellamento dell'usura. Sto usando AT45DB642D. – mjh2007

+0

@ mjh2007: hai ragione, quel controller non sembra avere una gestione speciale nel suo manuale delle specifiche. –

0

Si desidera sicuramente un buffer circolare. Ma hai ragione, la meta informazione è un po '... interessante.

0

Mappa le voci su diverse sezioni. Quando le sezioni sono piene, sovrascrivi iniziando dalla prima sezione. Aggiungi un numero di sequenza (numeri di sequenza nbr> 2 * voci), quindi al riavvio saprai qual è la prima voce.

0

È possibile eseguire una versione del buffer circolare, in cui il primo elemento memorizzato nella pagina è il numero di volte in cui la pagina è stata scritta. Questo ti permette di determinare dove dovresti scrivere dopo trovando la prima pagina dove il numero è più basso della pagina precedente. Se sono tutti uguali, inizi dall'inizio con il numero successivo.

Problemi correlati