Hallo liebe Leute, ich habe mal eine eigentlich simple Frage zum Speichern von Daten im Flash, stehe aber grade wohl ein wenig auf dem Schlauch und brauche dazu eure Hilfe :). Und zwar folgende Situation: Ich habe einen MSP430 und möchte dort im Flash Konfig Werte speichern, welche später per Interface aber geändert werden können. Das Problem an der ganzen Sache ist nur, dass diese Konfig Werte größtenteils 1-2 Bytes haben und diese, um Platz zu sparen, im selben Segment abgelegt sind..... dh wenn ich einen Wert ändern möchte muss ich ja das ganze Segment löschen und neu schreiben.... dh zwischenspeichern der Werte im RAM? oder die Belegung der Bytes ändern, sodass sie unabhäniger sind? Sorry für so ne simple Frage und danke für eure Hilfe :-) Grüße. Veranschaulicht: 0x01000 KonfigParam1 0x01001 KonfigParam2 0x01002 KonfigParam2 0x01003 KonfigParam3 0x01004 KonfigParam3 0x01005 KonfigParam3 0x01006 KonfigParam3 0x01007 KonfigParam4 Und hierbei möchte ich zB nur den KonfigParam2 ändern. Was sollte man bei sowas also machen?
Oder macht man das ganz anders? Bin ich grade ein wenig verwirrt? Oder wie kann ich einen Wert im Flash überschreiben?
Auszug aus dem Datenblatt: flash memory The flash memory can be programmed via the JTAG port, the bootstrap loader, or in-system by the CPU. The CPU can perform single-byte and single-word writes to the flash memory. Features of the flash memory include: Flash memory has n segments of main memory and two segments of information memory (A and B) of 128 bytes each. Each segment in main memory is 512 bytes in size. Segments 0 to n may be erased in one step, or each segment may be individually erased. Segments A and B can be erased individually, or as a group with segments 0−n. Segments A and B are also called information memory. New devices may have some bytes programmed in the information memory (needed for test during manufacturing). The user should perform an erase of the information memory prior to the first use. Also, auch ein einzelnes Byte kann beschrieben werden. MW
Danke für die Antwort. Ich glaube ich habe mich falsch ausgedrückt. Was ich will ist nämlich, einen bereits beschriebenen 2 Byte Bereich erneut zu beschreiben, ohne dabei alles andere zu verlieren. So wie ich es aber verstanden habe, muss für einen Schreibvorgang vorher das ganze Segment gelöscht werden? 128byte? Wenn ja ist nun die Frage, wie ich bzw es allgemein gemacht wird, wenn so eine Situation auftitt.... also entweder ein Abbild in den Ram machen, löschen und dann neu flashen oder kA.... Danke :).
Und was spricht gegen ein externes EEPROM für 20 Cent? MW
Also ich mache es so, dass ich die 128 Byte im RAM zwischenspeichere, das Flash-Segment lösche, den RAM-Zwischenspeicher aktualisiere und ihn dann komplett wieder ins Flash schreibe. Vorraussetzung hierfür ist natürlich, dass Du die 128Bytes im RAM während dieses Vorgangs immer sicher zur Verfügung hast. Nicht dass Dir z.B. der Stack aus Versehen reinpfutscht!
Danke für den Tipp, ich habe so etwas schon befürchtet. Gibt es da evt auch eine recht effektive Methode? Grüße
Soo, ich habs nun so gemacht wie geschrieben: Alles wichtige auslesen, speichern im Ram, Flash löschen, alles bis auf den neuen Wert zurückschreiben, neuen Wert in Flash schreiben. Funktioniert auch soweit wunderbar, ist halt nur sehr aufwendig....aber das ändern der Konfigparams kommt ja auch ned jeden Tag vor....bzw nicht jede Stunde ;-). Grüße und Danke!
>Gibt es da evt auch eine recht effektive Methode?
Für was ?
RAM reservieren, Stack unter Kontrolle halten, Flash beschreiben, ...???
>alles bis auf den neuen Wert zurückschreiben, >neuen Wert in Flash schreiben. Naja, eben nicht! Erst den neuen Wert in der RAM-Sicherung ändern und dann das RAM am Stück neu ins Flash!
Naja, ich hab die Methode ein wenig abgewandelt, da ich nicht alle 128Byte auslesen muss. Ich ziehe mir die Werte raus die ich brauche, speichere sie in Variablen und lösche den Flash. Danach schau ich welche der Variablen sich geändert hat und schreibe alle bis auf die zurück (enthält ja den alten ausgelesen Wert).- Somit ist der Bereich wo der neue Wert hinkommen soll mit 0xFF frei und er kann anschließend geschrieben werden. ich arbeit mit festen Addressen und von daher ist das doch ok so? Grüße.
Weil Du halt nach 'ner effektiven Lösung gefragt hast... Sicher geht das, wie Du's machst auch. Ist halt u.U. unflexibel, wenn doch mal neue Konfigdaten dazukommen, die dann auch erst gesichert werden müssen.
Also ich kenne das Flash-Macro des MSP 430 nicht aber der Flash wird immer Blockweise gelöscht (Inhalt auf 0xFF) und anschliessend kann granular geschrieben werden (Byte oder Word). Man kann auch ein bereits geschriebenes Byte erneut schreiben, allerdings nur von 1 nach 0. Auf 0 geschriebene Bits sind nur per Erase wieder auf 1 zu bringen. Die ganzen Daten zwischenzuspeichern um anschliessend den kompletten Block neu zu schreiben ist sicher nicht "state-of-the-art".
Naja genau darum geht es. Ich habe ein Flashsegment (128Byte, von einem 256Byte Block) das bereits Daten mit fester Adresse enthält. Beispiel: 0x01000 0x34 - hier werden spezielle konfig daten gespeichert, zb ID 0x01002 0x21 - hier wird was anderes gespeichert etc Wenn ich nun die ID ändern will, muss ich ja zwangsläufig alles löschen da ich sie nicht umschreiben kann. Dh also, damit ich die restlichen Werte nicht verlieren muss ich diese alle speichern und dann neu rein schreiben. Oder macht man das alles ganz anders? Keine feste Addressen? o.ä.?
Das mit dem unflexible stimmt, und deswegen habe ich es jetzt so gelöst, dass ich den RAM speichere, dann neue Daten im Flash ablege (evt auch in dem RAM dann, mal sehen) und wenn alle neuen Daten drinnen sind einen Abgleich zwischen RAM und Flash mache und überall dorthin, wo 0xFF im Flash und in dem RAM Speicher etwas steht es in den Flash reinfülle....ich denke das ist recht flexible...efiizient, kA ;-) Danke und Grüße. PS: Ich bin aber immernoch für Alternativen offen :)!
>und wenn alle neuen Daten drinnen sind einen >Abgleich zwischen RAM und Flash mache und überall dorthin, wo 0xFF im >Flash und in dem RAM Speicher etwas steht es in den Flash >reinfülle....ich denke das ist recht flexible...efiizient, kA ;-) Habe ich irgendein 'Gimmick' verpasst? ;-) Vielleicht hast Du Dich nicht klar genug ausgedrückt oder ich hab's nur nicht verstanden, was Du damit sagen willst... aber effizient sieht das nicht aus. Flash löschen heißt, alle Daten darin gehen verloren. Also Flash-Inhalt erstmal komplett im RAM sichern. Da sind wir uns glaub ich einig?! Dann die RAM-Sicherung bearbeiten (z.B. Deine ID ändern...) und schließlich die RAM-Sicherung in einem Rutsch wieder ins Flash zurück schießen. Da braucht man nix abgleichen oder nach 0xFF suchen, usw. Oder welchen genialen Sinn hat Deine obige Theorie... ich lerne gerne dazu! :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.