Frage

ich brauche Elemente zu speichern, von unterschiedlicher Länge in einer zirkulären Warteschlange in einem Flash-Chip. Jeder Einzelteil wird seine Verkapselung hat, so kann ich herausfinden, wie groß es ist und wo der nächste Punkt beginnt. Wenn es genügend Elemente in dem Puffer sind, wird es an den Anfang wickeln.

Was ist ein guter Weg, um eine kreisförmige Warteschlange in einem Flash-Chip zu speichern?

Es gibt eine Möglichkeit, mehrere zehntausend Artikel würde ich speichern möchten. So beginnen am Anfang und Lesen bis zum Ende des Puffers ist nicht ideal, weil es an der Zeit bis zum Ende zu suchen braucht.

Auch, weil sie kreisförmig ist, muß ich das erste Element vom letzten unterscheiden zu können.

Das letzte Problem ist, dass diese im Flash gespeichert sind, so dass jeder Block Löschen sowohl zeitaufwendig und können nur eine bestimmte Anzahl von Zeiten für jeden Block durchgeführt werden.

War es hilfreich?

Lösung

Als erstes Block Management:

Setzen Sie einen kleineren Header zu Beginn jedes Blocks. Die Hauptsache Sie brauchen, um den Überblick über die „ältesten“ und „neueste“ ist eine Blocknummer, die einfach erhöht Modulo k . k muss größer sein als Ihre Gesamtzahl der Blöcke. Idealerweise macht k weniger als Ihr MAX-Wert (z 0xFFFF), so kann man leicht sagen, was ist ein gelöschter Block.

Bei der Inbetriebnahme, liest den Code der Header eines jeden Blocks nacheinander, und lokalisiert die ersten und letzten Blocks in der Folge, dass n i + 1 = (n i + 1) modulo k. Achten Sie darauf, nicht von gelöschten Blöcken (Blocknummer ist beispielsweise 0xFFFF) oder Daten verwechselt werden, die irgendwie beschädigt ist (zum Beispiel unvollständige Löschen).

In jedem Block

Jeder Block beginnt zunächst leer (jedes Byte 0xFF). Jeder Datensatz wird einfach geschrieben nacheinander. Wenn Sie mit fester Größe Datensätze haben, dann können Sie es mit einem einfachen Index zugreifen. Wenn Sie mit variabler Größe Datensätze haben, dann ist es zu lesen Sie von Anfang des Blocks, verknüpfte Liste Stil zu scannen haben.

Wenn Sie mit variabler Größe Aufzeichnungen haben wollen, aber lineare Abtastung zu vermeiden, dann könnte man auf jeden Datensatz eine gut definierte Header haben. Z.B. verwenden 0 als Satzbegrenzer und COBS -encode (oder COBS / R -encode ) jeder Datensatz. Oder verwenden Sie ein Byte Ihrer Wahl als Trennzeichen und ‚Escape‘, das Byte, wenn es in jedem Datensatz auftritt (ähnlich der PPP-Protokoll ).

Bei der Inbetriebnahme, sobald Sie Ihren letzten Block kennen, können Sie für die aktuelle Datensatz einen linearen Scan tun. Oder wenn Sie mit fester Größe Aufzeichnungen oder Datensatz-Trennzeichen, könnten Sie eine binäre Suche.

Löschen Scheduling

Für einige Flash-Speicherchips, kann ein Blocklösch erhebliche Zeit in Anspruch nehmen - z. 5 Sekunden. Betrachten wir ein Lösch als Hintergrund-Task Scheduling ein bisschen „vor der Zeit“. Z.B. wenn der aktuelle Block x% voll ist, dann starten Sie den nächsten Block zu löschen.

Datensatz Nummerierung

Sie möchten vielleicht Anzahl Datensätze. So wie ich es in der Vergangenheit getan haben, ist zu setzen, in der Kopfzeile eines jeden Blocks, die Datensatznummer des ersten Datensatzes. Dann hat die Software innerhalb der Blockanzahl der Zahlen jeden Datensatz zu halten.

Checksum oder CRC

Wenn Sie beschädigte Daten erkannt werden sollen (zum Beispiel unvollständigen schreibt oder löscht aufgrund unerwarteten Stromausfall), dann können Sie eine Prüfsumme oder CRC zu jedem Datensatz hinzufügen und vielleicht auf die Block-Header. Beachten Sie die Block-Header CRC würde nur decken den Header selbst, nicht die Datensätze, da es nicht neu geschrieben werden könnte, wenn jeder neue Datensatz geschrieben wird.

Andere Tipps

Halten Sie einen separaten Block, der einen Zeiger auf den Anfang des ersten Satzes und dem Ende des letzten Datensatzes enthält. Sie können auch weitere Informationen wie die Gesamtzahl der Datensätze halten, etc.

Bis Sie zunächst aus dem Raum laufen, Aufzeichnungen Hinzufügen wie so einfach ist, sie bis zum Ende des Puffers zu schreiben und die Aktualisierung der Endzeiger.

Wie Sie brauchen Platz zurückzufordern, löschen genügend Datensätze, so dass Sie Ihre aktuellen Datensatz passen. Aktualisieren Sie den Kopfzeiger, wie Sie Datensätze löschen.

Sie müssen, um verfolgen, wie viel zusätzlichen Platz frei wurde. Wenn Sie einen Zeiger auf Ende des letzten Datensatzes zu halten, das nächste Mal einen Datensatz hinzufügen möchten, können Sie vergleichen, dass mit dem Zeiger auf den ersten Datensatz, um zu bestimmen, wenn Sie weitere Datensätze löschen müssen.

Auch wenn diese NAND ist, Sie oder der Flash-Controller müssen Deblockierung tun und Fließe zu tragen, aber dass alle auf einer unteren Schicht sollte Raum für den Ringpuffer als zuordnet.

Ich glaube, ich es bekommen. Es scheint, wie Ihr größtes Problem wird sein, den verfügbaren Raum für die Aufnahme gefüllt zu haben, was passiert als nächstes? Die neuen Daten sollten die ältesten Daten überschreiben, das ist glaube ich, was Sie von einem Ringpuffer bedeuten. Da aber die Datenlänge nicht festgelegt ist, kann man mehr als einen Datensatz zu überschreiben.

Ich gehe davon aus, dass die Menge an Variabilität in der Länge hoch genug ist, dass alles Polsterung aus auf eine feste Länge ist keine Option.

Ihr Schreib Segment muss den Überblick über die Adresse halten, die den Anfang des nächsten Datensatz repräsentiert zu schreiben. Wenn Sie die Größe eines Block zu schreiben vor der Zeit kennen, können Sie sagen, wenn Sie am Ende des logischen Puffers, um am Ende gehen und von vorne beginnen bei ‚0‘. Ich würde nicht einen Rekord aufgespalten am Ende mit einigen und einigen am Anfang.

Ein separates Register kann den Anfang verfolgen; Dies ist die ältesten Daten, die noch nicht überschrieben wird. Wenn Sie die Daten auszulesen, ging das ist, wo Sie beginnen würde.

Der Datenschreiber würde dann, überprüfen Sie die Schreibstartadresse angegeben und die Länge der Daten seiner über, zu begehen, wenn sie die Leseregister stoßen sollte, die den ersten Block untersuchen würde und die Länge und in die nächste sehen Rekord, bis es genügend Platz zum schreiben, was auch immer die Daten. Es wird eine Lücke von Junk-Daten sein, die wahrscheinlich zwischen dem Ende der geschriebenen Daten und dem Beginn der ältesten Daten lebt. Aber auf diese Weise, können Sie einfach schreiben eine Adresse oder zwei als Overhead und nicht neu anordnen Blöcke.

Mindestens, das ist wahrscheinlich das, was ich tun würde. HTH

Ich sehe drei Möglichkeiten:

option1: ist Pad alles aus auf die gleiche Größe, das ist einfach, speichern einen Zeiger auf den Kopf und Schwanz des Puffers so dass Sie wissen, wo zu schreiben und wo aus dem Lesen beginnen, verwenden Sie die Größe jedes Objekt einen Versatz zum nächsten gehen, dann können Sie den Puffer zu Quer benötigen, wie Sie eine verknüpfte Liste würde, auch bekannt als seine langsame, wenn Sie Artikel 5000 benötigen.

option2: nur Zeiger auf die realen Daten in den Ringpuffer zu speichern, auf diese Weise, wenn Sie umschlingen Sie müssen nicht mit der Größe mis-Matchs beschäftigen. wenn Sie die realen Daten in einem Ringpuffer gespeichert werden und es nicht polstern Sie in eine Situation führen könnte, wo Ihr über witting mehrere Artikel mit 1 neuen Datenobjekt, ich nehme an, dies nicht in Ordnung ist.

speichern die tatsächlichen Daten an anderer Stelle in Flash, die meisten Flash irgendeine Art von Abnutzungsausgleich eingebaut haben wird, wenn so dass Sie nicht die gleiche Lage versehentliche über mehrere Male kümmern müssen, wird Abbildung der IC, wo es tatsächlich speichern auf dem Chip, schreiben Sie einfach an den nächsten verfügbaren freien Speicherplatz.

Dies bedeutet, dass Sie eine maximale Größe für den Ringpuffer holen, wie Sie tun dies auf der Datenvariabilität abhängt. Wenn die Größe der Daten nur viel ändern, sagen nur von wenigen Bytes, dann sollten Sie es nur polstern und verwenden Sie die Option 1. Wenn die Größenänderungen wild und unvorhersehbar, wählen Sie die größte Größe könnte es sein und herauszufinden, wie viele Objekte von dieser Größe in Ihrem Flash passen würde, verwenden, die als die maximale Anzahl der Einträge im Puffer. Dies bedeutet, dass Sie eine Reihe von Raum verschwenden.

Option 3: wenn das Objekt wirklich jede Größe sein können, kommen Sie an dem Punkt, wo Sie nur ein Dateisystem verwendet werden soll, benennen Sie die Dateien um und Schleife zurück, wenn Ihre vollständige unter Berücksichtigung, wenn Ihr neuer Eintrag ist groß Sie können müssen mehrere alte Einträge löschen passen. Das ist wirklich nur eine Erweiterung der Option 2 als option2 in vielerlei Hinsicht ein einfaches Dateisystem ist.

Das „Rundschreiben“ in einem Blitz kann auf Basis von Blockgröße durchgeführt werden, was bedeutet, dass Sie, wie viele Blöcke des Flash erklären müssen Sie für diesen Puffer zuweisen.

Die tatsächliche Größe des Puffers zu jedem speziellen Zeitpunkt zwischen n-1 ist (n ist die Anzahl der Blöcke) und n.

sollte Jeder Block mit einem Kopf zu starten, die laufende Nummer oder einen Zeitstempel enthält, die verwendet werden könnten, um zu bestimmen, welcher Block älter ist als die andere.

Jedes Element mit einer Kopf- und einer Fußzeile verkapselt. der Standard-Header enthält alles, was Sie wollen, aber nach diesem Header müssen Sie die Größe des Elements kennen. Das Standard-Fußzeile ist 0xFFFFFFFF. Dieser Wert zeigt eine Null-Terminierung.

In Ihrem RAM müssen Sie einen Zeiger auf den ältesten Block speichern und den neuesten Block und Zeiger auf den ältesten Artikel und aktuelle Artikel. Beim Einschalten gehen Sie auf alle Blöcke die entsprechenden Blöcke finden und diese Mitglieder laden.

Wenn Sie ein neues Objekt speichern möchten, prüfen Sie, ob der letzte Block genügend Platz für diesen Artikel enthalten. Ist dies der Fall speichern Sie das Element am Ende des vorherigen Punktes und die Änderung der vorherigen Fußzeile dieses Element zu zeigen. Wenn es nicht genügend Platz enthält müssen Sie den ältesten Block löschen. Bevor Sie dieser Block löschen Sie die ältesten Blockelemente ändern (RAM) auf dem nächsten Block zu zeigen und den ältesten Artikel auf dem ersten Punkt in diesem Block zu zeigen. Dann können Sie das neue Element in diesem Block speichern und die Fußzeile des neuesten Artikels ändern, um dieses Element zu zeigen.

Ich weiß, dass die Erklärung klingt kompliziert kann aber der Prozess ist sehr einfach und wenn Sie es schreiben, korrigieren Sie es sogar Macht sicher nicht machen kann (immer im Sie die Reihenfolge der Schreibvorgänge ausmacht).

Achten Sie darauf, dass die Kreisförmigkeit des Puffers wird nicht im Flash gespeichert, aber der Blitz enthält nur Blöcke mit Gegenständen, die Sie nach den Blöcken entscheiden können Kopf- und Artikel-Header, was die Reihenfolge dieser Elemente sind

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top