Speichern beim STM32 ins Flash

Im Flash kann immer nur ein ganzer Block gelöscht werden und das 
Schreiben geht nur in einer Richtung. Es gibt Code zur Eeprom Simulation 
im Flash welcher ein Wear Leveling macht und die benutzten 
Speicherstellen gleichmässig verteilt. Hierzu wird immer eine virtuelle 
Adresse und die dazugehörenden Daten (irgendwo passend mithilfe eines 
Verzeichnisses) gespeichert. Siehe Application notes...

Der STM32L1x hat echtes Eeprom welches Wortweise beschrieben werden 
kann.
Löschen kann man nur jeweils eine ganze Flash-Page, schreiben kann man 
allerdings in Blöcken von z.B. 8 Bytes (STM32G0x).

Man kann es so programmieren, dass man immer Werte innerhalb einer Page 
"hinten" anhängt, bis die Page voll ist. Dann löscht man die ganze Page 
und fängt von vorne an.

Wie voll eine Page ist kann man erkennen ab wo nur noch 0xff Bytes 
kommen (der Zustand nach dem Löschen der Page).

Wenn man Daten verschiedener Längen im Flash speichern will, kann man in 
das erste Wort jeweils noch die Länge der folgenden Daten schreiben, 
dann kann man sich anhand dieser Werte schnell zum Ende der "Liste" 
hangeln und weiß wo man weiter schreiben kann.

Steht dann an dieser Stelle ein "0xffffffff", weiß man dass man am Ende 
ist.
Gast
Also sich auf ein Bitmuster zu verlassen geht doch gar nicht. Das können 
auch immer reguläre Nutzdaten ein. Da muß man schon einen separaten 
Positionszeiger spendieren, wenn es zuverlässig sein soll.
Gast
Volatile im Battery-Backup-RAM? Wenn der Chip keins hat: Designfehler. 
Wenn tatsächlich abgeschaltet wird, muß der natürlich selbst im Flash 
gespeichert werden. Oder gleich ein kleines FRAM nehmen.
Schwanzus Kurzus schrieb:
> Also sich auf ein Bitmuster zu verlassen geht doch gar nicht. Das können
> auch immer reguläre Nutzdaten ein. Da muß man schon einen separaten
> Positionszeiger spendieren, wenn es zuverlässig sein soll.

Das mit dem Bitmuster geht schon so. Da es (bei meiner Implementierung) 
die oben erwähnte Längenangabe ist, kann diese niemals 0xffffffff sein.

-1/0xffffffff als einen speziellen Wert zu verwenden wird bei vielen 
Funktionen im Unix-Umfeld gemacht.

Natürlich muss man schon noch den Fall abfangen, dass es evtl. einen 
Lesefehler im Flash geben kann. Man könnte als erstes Wort z.B. auch 
noch eine Prüfsumme hinzufügen.
Gast
Schwanzus Kurzus schrieb:
> Volatile im Battery-Backup-RAM? Wenn der Chip keins hat: Designfehler.
> Wenn tatsächlich abgeschaltet wird, muß der natürlich selbst im Flash
> gespeichert werden. Oder gleich ein kleines FRAM nehmen.

Es gibt jede Menge Einsatzgebiete wo Batterien verboten sind. Erzeugen 
nur lästigen Serviceaufwand.

Und natürlich kann man 0xffffffff als gelöschte Speicherzelle hernehmen, 
da braucht es keine separaten Positionspointer.

Allerdings wäre eine Checksum im gespeicherten Datensatz nicht schlecht.
Gast
c-hater schrieb:
> NichtWichtig schrieb:
>
>> Schwanzus Kurzus schrieb:
>>> Oder gleich ein kleines FRAM nehmen.
>>
>> Es gibt jede Menge Einsatzgebiete wo Batterien verboten sind. Erzeugen
>> nur lästigen Serviceaufwand.
>
> Tja, genau deswegen wurde wohl FRAM erfunden, die brauchen keine
> Batterien...
>
> Du scheinst davon noch nicht einmal gehört zu haben...

Das Vorhandensein solcher Bausteine ändert nichts an meiner Aussage.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.