PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Flash-Speicher Schreibzyklen



Bumbum
04.12.2012, 10:23
Hallo,

ich habe eine Frage zu den Lösch-/Schreibzyklen von Flash-Speichern. Speziell geht es mir aktuell um den A25L080. Im Datenblatt (http://www.amictechnology.com/pdf/A25L080.pdf) steht, dass er 100000 Lösch-/Schreibzyklen abkann.

Beim löschen werden alle Bits im Speicher auf 1 gesetzt und man kann sie nur auf 0 "schreiben". Wenn ein Bit mal 0 ist kann man es nur durch löschen wieder auf 1 setzen. (Ich habe probiert eine 1 reinzuschreiben, es bleibt aber 0)

Die kleinste Einheit, die gelöscht werden kann ist ein Sektor, der aus 4096 Bytes besteht. Ich möchte nun im ersten Sektor eine Art Inhaltsverzeichnis anlegen. Ich benötige dafür unter anderem 256 Status-Bits. (32 Bytes) Die Bits werden nach und nach auf 0 gesetzt, jedes mal nach einer halben Minute und eines neuen Schreib-Vorgangs.

Wenn ich jetzt z.B. das erste Byte betrachte ist der Ausgangszustand nach dem löschen:

0b11111111

Ich setze nun ein Bit auf 0, dann sieht es z.B. so aus:

0b11111110

Wenn ich nun noch ein Bit auf 0 setze mit folgendem Ergebnis:

0b11110110

zählt das dann bereits als zwei Schreib-Zyklen? Ich bin der Meinung, dass ein Zyklus erst wieder durch löschen des ganzen Sektors gezählt wird, kann mich aber auch irren. Das ganze wäre aber wichtig, denn wenn es pro Nullen eines Bits einen Zyklus "kostet" muss ich mir eine andere Vorgehensweise überlegen, denn sonst hält mein Speicher nur knapp ein halbes Jahr und dann sind die Zyklen verbraucht.

Die Frage, die mich also quält: Wenn ich jetzt nach und nach alle 8 Bits des ersten Bytes gelöscht habe zählt das dann als 8 Schreib-Zyklen, oder nur als einer?

Ich habe bereits Google zu diesem Thema befragt, aber keine vernünftige Aussage erhalten, vor allem nicht auf mein IC. Auch eine Mail an den Hersteller blieb leider unbeantwortet. (seit über einer Woche, ich habe keine Hoffnung, dass da noch was kommt) Wer klärt mich bei den Flash-Speichern auf?

Vielen Dank und viele Grüße
Andreas

oberallgeier
04.12.2012, 10:39
... Flash ... 100000 Lösch-/Schreibzyklen ... hält mein Speicher nur knapp ein halbes Jahr ...Ein knappes halbes Jahr: 180 Tage zu je 86400 Sekunden. Du flasht Deinen Speicher über sechs Monate einmal alle zweieinhalb Minuten? 24/7! Boah. Du meinst schon FLASH nicht SRAM ?

Bumbum
04.12.2012, 10:55
Nein, die Status-Bits werden sogar alle 30 Sekunden geflasht. Gerechnet habe ich dabei eine Betriebsdauer von 10 Stunden pro Tag. Im nachhinein wäre ein SRAM mit Goldcap besser gewesen, aber ich wollte die Ausfallsicherheit beim Akku wechsel idiotensicher gestalten.

Kampi
04.12.2012, 11:29
Hey,

ein Flash-Speicher überschreibt ein komplettes Byte und die Schreibzyklen beziehen sich auf 10000 Zyklen pro Zelle.
Ein Sektor sind ja mehrere Zellen zusammen gefasst. Wenn du nun also ein einzelnes Bit löscht und wieder setzt, hast du die Zelle 2x beschrieben (Löschen zählt übrigens auch als Schreiben).
Ein Flash-Speicher ist für sowas eine denkbar schlechte Wahl.
Was spricht den gegen ein SRAM mit Goldcap? Das hält doch lange genug für einen Akkuwechsel.
Ansonsten pufferst du den µC und er soll dann einen Spannungsabfall detektieren, was in sein EEPROM schreiben und sobald die Spannung wieder da ist nutzt er das SRAM.

Bumbum
04.12.2012, 11:45
Hallo Kampi,


Wenn du nun also ein einzelnes Bit löscht und wieder setzt, hast du die Zelle 2x beschrieben (Löschen zählt übrigens auch als Schreiben).

Und wenn ich das löschen zwischen drin weglasse? Nehmen wir mal an ich setzte alle 30 Sekunden ein Bit des gleichen Bytes auf 0. Sind das dann deiner Meinung nach 8 Schreibzyklen für das Byte verbraucht, oder erst einer?

Viele Grüße
Andreas

- - - Aktualisiert - - -

Nachtrag zum Thema SRAM+Goldcap: Es gibt immer Alternativen, mir geht es aber bei dieser Frage auch um die Grundlagen zum Thema Flash.

Dnerb
04.12.2012, 19:31
Der Flash ist ja nach 100.000 Schreibzyklen ja nicht sofort defekt.
Du hast 4096 Bytes in einem Sektor. Benutze doch nicht nur 32 Byte für den Status, sondern nimm alle 4096.

Somit kannst Du die Sache schonmal ausdehnen.
Wie lange soll die Schaltung denn funktionieren? (Ernstgemeinte Frage!)

Den Status wegen der Ausfallsicherheit beim Akkuwechsel in den Flash legen ist aber nicht so elegant.
Vor dem Akkuwechsel runterfahren wäre eleganter, macht man bei PCs ja auch. ;-)

Des weiteren kannst Du Dir Überlegen eine SD-Karte zu nehmen, dann brauchst DU Dir keine Gedanken mehr zu machen, die Karte selber verteilt die zu schreibenden Daten so das jede Zelle möglichst gleichmässig benutzt wird.

Bumbum
05.12.2012, 18:43
Hallo,

ich habe den Flash auch wegen der Größe gewählt. Ich möchte schon locker ein halbes MB an Daten speichern, bis ich zum auslesen komme.

Wie lange das Ganze halten soll? Da es ein SMD-Teil ist habe ich keine Lust es irgendwann mal tauschen zu müssen. Ich denke 5 Jahre sollten es schon sein.

Dieser Thread soll mir die Grundlagen der Flash-Speicher näher bringen. Es geht mir deshalb auch um die Vorgehensweise, wie ich das Ganze dann programmiere. Wenn es nicht anders geht muss halt eine Rotation rein, benötigt aber mehr Arbeit und mehr Speicher im Flash des µC.

Bei den oben genannten Bits im Beispiel handelt es sich nicht um richtige Status-Bits, sondern mehr um ein Art Inhaltsverzeichnis, welcher Bereich vom Flash schon mit gültigen Daten belegt ist. Pro Datensatz im Sektor habe ich mir überlegt ein Bit zu setzen. Da ich keinen einzelnen Zahlenwert schreiben kann (nur löschen vom ganzen Sektor möglich) bin ich überhaupt auf diese Idee gekommen. Aber natürlich nur wenn das löschen der einzelnen Bits nicht jedes mal einen Schreib-Zyklus bedeutet.

Das Gerät soll unbeaufsichtigt laufen und Daten aufzeichnen. Deshalb ist die Wahrscheinlichkeit eines leeren Akkus sehr hoch. Wenn der Flash nicht so will, wie ich es mir denke ist die Option einen leeren Akku zu erkennen um dann "herunterzufahren" auch eine Möglichkeit, kostet aber auch wieder Bauteile, Programmieraufwand und Platz im Flash des µC.

Mit SD-Karten habe ich schon mal gearbeitet und war nicht zufrieden damit. Da fängt es beim hohen Stromverbrauch an, geht über die Verfügbarkeit "normaler" größen (halbes MB ;-) ) und endet beim zickigen Verhalten, je nach Hersteller und Kartentyp und -größe.

Auf meine Frage, ob das einzelne setzen von Bits (auf 0) eines Bytes, ohne zwischendurch den Sektor zu löschen auch als Schreibzyklus zählt habe ich leider immer noch keine Antwort.
Da ich Google bezüglich dieses Themas schon versucht habe eine Antwort zu entlocken, aber nichts gefunden habe bin ich auch für Links dankbar, in denen das vielleicht beschrieben wird.

Viele Dank fürs mitdenken und viele Grüße
Andreas

Klebwax
05.12.2012, 21:55
Auf meine Frage, ob das einzelne setzen von Bits (auf 0) eines Bytes, ohne zwischendurch den Sektor zu löschen auch als Schreibzyklus zählt habe ich leider immer noch keine Antwort.

Es wird immer ein Byte geschrieben. Daß du dabei nur ein Bit änderst, macht dabei nichts. Ob in deinem Flash ein Byte aus 8 Zellen besteht, ist nicht sicher. Inzwischen werden zum Teil mehr als zwei Werte in einer Zelle gespeichert, du änderst also eine Zelle mehrfach.

Ich würde einfach mit einem gelöschten Flash anfangen und die Daten nacheinander schreiben. Solange du sicherstellst, daß sich deine gültigen Daten erkennbar vom gelöschten Flash unterscheiden, kannst du immer erkennen, wie viel schon geschrieben wurde. Da braucht man kein Direktory.

MfG Klebwax

Bumbum
06.12.2012, 20:03
Hallo Klebwax,

jetzt holt mich ein, dass ich mit Information "gegeizt" habe. Ich brauche auf jeden Fall noch ein "verarbeitet" Flag pro Eintrag. Das macht es dann nicht ganz so einfach.

Ich müsste jetzt quasi feststellen, wie groß eine "Zelle" ist. Im Optimalfall ein Byte, dann brauche ich pro Eintrag zwei Bytes im Directory (belegt und verarbeitet). Das wäre auch vertretbar.
Nur wie kommt man an die Information, wenn im Datenblatt nichts steht und der Hersteller schweigt?

Viele Grüße
Andreas

Klebwax
06.12.2012, 21:03
Hallo Klebwax,

jetzt holt mich ein, dass ich mit Information "gegeizt" habe. Ich brauche auf jeden Fall noch ein "verarbeitet" Flag pro Eintrag. Das macht es dann nicht ganz so einfach.

Ich müsste jetzt quasi feststellen, wie groß eine "Zelle" ist. Im Optimalfall ein Byte, dann brauche ich pro Eintrag zwei Bytes im Directory (belegt und verarbeitet). Das wäre auch vertretbar.
Nur wie kommt man an die Information, wenn im Datenblatt nichts steht und der Hersteller schweigt?

Warum sollte er dir das sagen? Wenn seine Techniker einen Trick entwickeln, die Bits noch enger zu packen, kann er den Die kleiner machen und mehr verdienen. Solange sich das Interface nicht ändert, kann er sogar die Typenbezeichnung gleich lassen. Und alle Anwender, die nur die veröffentlichten Informationen verwenden, würden es nicht merken und sich trotzdem on the long run über sinkende Preise freuen.

Das mit dem Direktory ist eine schlechte Idee, das ist was fürs RAM oder einen magnetischen Speicher. Überleg dir ein anderes Konzept. Denk doch noch mal über SD nach, benutzt wie ein FLASH ohne Filesystem mit SPI. Einfach z.B. ein Record pro Sektor (obwohl ich deine Datenstruktur nicht kenne), da hast du Platz ohne Ende, 4 GB, 16GB oder auch mehr.

MfG Klebwax

Bumbum
07.12.2012, 14:02
Hallo Klebwax,

ich bin für Vorschläge gerne offen. Im Moment habe ich eine Denkblockade wie ich es anders lösen könnte. Ich würde gerne erst mal beim Flash bleiben wegen meinen schlechten Erfahrungen mit der SD-Karte. Alleine die Verfielfachung der nötigen Akku-Kapazität schreckt mich schon ab.

Vielleicht fällt dir, oder jemand anderem eine Lösung ein

Der groben Ablauf: Ein µC sammelt Daten. Alle 30 Sekunden kommt ein Datensatz dazu. Alle 10 Minuten versucht der Controller alle unverarbeitete Datensätze zu verarbeiten. Ob er es schafft hängt von diversen Signalen ab, die an den IO-Leitungen anliegen. Ein Datensatz darf nicht zwei mal verarbeitet werden.

Ein Datensatz besteht aus 16 Byte + die von mir ausgedachten Flags "vorhanden" und "verarbeitet".
Ich möchte das Gerät ein paar Tage (max. eine Woche) im Betrieb haben, ohne das Daten verloren gehen. Die Daten werden dann von mir über eine Schnittstelle ausgelesen.

Wenn ich das Inhaltsverzeichnis weglasse, bzw. nur die Flags im zugehörigen Sektor speichere und eine Rotation einbaue dürfte der Flash wesentlich länger halten wie mein berechnetes halbes Jahr. Oder habe ich einen Denkfehler?

Viele Grüße
Andreas

RoboHolIC
08.12.2012, 02:05
Kann man den Datensätzen im EEPROM evtl. eine laufende Nummer/ Index mitgeben und der PC-Software die Koordination durch Auslesebefehl an den µC, Verarbeitung und Löschbefehl an den µC überlassen?

Oder der Controller schreibt erstmal die Rohdaten in einen Speicherblock und macht dann die Verarbeitung und Speicherung in einen anderen Block in einem Rutsch. Das kann man im µC-Code schon irgendwie absichern, dass keine Daten verlorengehen; erst dann werden die Rohdaten gelöscht. Ggf. noch eine "Block in Arbeit"-Kennung. Damit könnte man die Schreibzyklen pro Byte auf wenige Male je Blockbelegung reduzieren.

Wieviel SRAM hat dein Controller? Kannst du die Rohdaten nicht dort ablegen? Schließlich ist doch eine Batteriepufferung gegeben. Hmm - da war doch was mit Batteriewechsel, herunterfahren und idiotensicher, oder??? Speicherung und Powerdown durch Gehäuseschalter auslösen?

Klebwax
08.12.2012, 15:58
So richtig erschließt sich mir dein Problem nicht. Wenn ich richtig gerechnet habe, fallen pro Woche so 600k Daten an, sagen wir mal einfach 1MB. Hast du also 1MB Flash, wird das im Jahr 50 mal geschrieben. Selbst wenn du irgendwas zweimal schreiben mußt, sind es auch nur 100 mal im Jahr. Jetzt mal ganz extrem gedacht: auf eine 1GB SD Karte passen die Daten von ca. 20 Jahren, ohne eine Speicherstelle zweimal zu benutzen. Und den Standby Strom von 250µA halte ich nicht für sehr viel, außerdem kann man sie leicht über einen SOT23 FET ausschalten.

MfG Klebwax

Bumbum
09.12.2012, 09:20
Guten Morgen Klebwax,

so gesehen hast du recht. Aber dafür ist das Forum da, um mich vom Holzweg wieder auf den richtigen Pfad zu führen. Wenn ich eine Rotation der Sektoren einbaue sollte es tatsächlich mit maximal 100 Schreibzyklen im Jahr hinkommen, wie von dir berechnet. 1000 Jahre Haltbarkeit, oder sogar nur 10% davon würde mir also ausreichen. ;-)

@RoboHolIC: Es ist ein ATmega162. von den 1k RAM sind bereits knapp über 50% für das Programm belegt. Abzüglich des Stacks würden also ca. 16 Datensätze reinpassen, was für nicht mal 10 Minuten reichen würde.

Ich denke ich versuche es jetzt mit dem Flash und baue eine Sektor-Rotation ein und damit sollte alles passen.
Schade finde ich es nur, dass meine eigentliche Frage verneint werden muss (einzelne Bits setzen zählt nicht jedes mal als Schreibzyklus).

Vielen Dank an alle Mitdenker und viele Grüße.
Andreas