2009-11-18 4 views
5

Ich versuche eine Alarm-History-Struktur zu entwickeln, die im nichtflüchtigen Flash-Speicher gespeichert wird. Der Flash-Speicher hat eine begrenzte Anzahl von Schreibzyklen, daher brauche ich eine Möglichkeit, Datensätze zu der Struktur hinzuzufügen, ohne jedesmal die Flash-Seiten in der Struktur neu zu schreiben oder aktualisierte Zeiger auf den Kopf/das Ende der Warteschlange zu schreiben.Alarmverlaufsstapel oder Warteschlange?

Zusätzlich, sobald der verfügbare Flash-Speicherbereich verwendet wurde, möchte ich beginnen, Datensätze zu überschreiben, die zuvor im Flash gespeichert wurden, beginnend mit dem ersten zuerst hinzugefügten Datensatz. Dies lässt mich denken, dass ein zirkulärer Puffer am besten zum Hinzufügen von Elementen geeignet wäre. Beim Anzeigen von Datensätzen soll die Struktur jedoch wie ein Stapel funktionieren. Z.B. Die Datensätze würden in umgekehrter chronologischer Reihenfolge "last-in-first-out" angezeigt.

Strukturgröße, Kopf, Endung, Indizes können nicht gespeichert werden, es sei denn, sie sind im Datensatz selbst gespeichert, da sie jedes Mal an einen festen Ort geschrieben würden und die maximalen Schreibzyklen auf der Seite überschreiten würden, auf der sie gespeichert wurden .

Also sollte ich einen Stapel, eine Warteschlange oder eine hybride Struktur verwenden? Wie sollte ich die Kopf-, End- und Größeninformationen im Flash speichern, damit sie nach dem Einschalten neu initialisiert werden können?

+0

Arbeiten Sie direkt am Flash oder verwenden Sie ein Dateisystem im Flash? – stefaanv

+0

Kein Dateisystem. Schreiben, um direkt zu blinken. – mjh2007

Antwort

4

Lookup ring-buffer

Angenommen, Sie arbeiten können, was der letzte Eintrag (etc von einem Zeitstempel müssen also nicht einen Marker schreiben) ist dies auch die beste Abnutzungsausgleichsleistung hat.

2

Edit: Gilt nicht für den OP-Flash-Controller: Sie sollten sich nicht um wear leveling in Ihrem Code kümmern müssen. Der Flash-Speicher-Controller sollte dies hinter den Kulissen handhaben.

Wenn Sie jedoch immer noch tun möchten, tun Sie dies, verwenden Sie einfach einen regulären Ringpuffer und keep pointers to the head and tail des Stapels.

Sie können auch einen Least Recently Used cache verwenden, um zu verwalten, wo im Flash Daten gespeichert werden.

+0

Es ist nicht genau Wear Leveling. Er muss sich darauf konzentrieren, so oft wie möglich zu schreiben. –

+0

Ich bin mir ziemlich sicher, dass der Flash-Speicher-Controller keinen Wear-Leveling bietet. Ich verwende AT45DB642D. – mjh2007

+0

@ mjh2007: Sie haben Recht, dieser Controller scheint in seinem Spezifikationshandbuch keine spezielle Verwaltung zu haben. –

0

Sie wollen auf jeden Fall einen Ringpuffer. Aber du hast Recht, die Metainformationen sind ein bisschen ... interessant.

0

Ordnen Sie Ihre Einträge in mehreren Abschnitten zu. Wenn die Abschnitte voll sind, überschreiben Sie beginnend mit dem ersten Abschnitt. Fügen Sie eine Sequenznummer hinzu (nbr Sequenznummern> 2 * Einträge), so dass Sie beim Neustart wissen, was der erste Eintrag ist.

0

Sie könnten eine Version des Ringpuffers erstellen, wobei das erste Element, das auf der Seite gespeichert wird, die Anzahl der Male ist, die diese Seite geschrieben wurde. Dadurch können Sie bestimmen, wo Sie als nächstes schreiben sollten, indem Sie die erste Seite finden, auf der die Nummer niedriger ist als die vorherige Seite. Wenn sie alle gleich sind, beginnen Sie von Anfang an mit der nächsten Nummer.

Verwandte Themen