Forum: Mikrocontroller und Digitale Elektronik Frage zum Flashschreiben / Belegungsplan


von Bort M. (bort)


Lesenswert?

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?

von Bort M. (bort)


Lesenswert?

Oder macht man das ganz anders? Bin ich grade ein wenig verwirrt? Oder 
wie kann ich einen Wert im Flash überschreiben?

von Michael Wilhelm (Gast)


Lesenswert?

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

von Bort M. (bort)


Lesenswert?

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 :).

von Michael Wilhelm (Gast)


Lesenswert?

Und was spricht gegen ein externes EEPROM für 20 Cent?

MW

von Stefan (Gast)


Lesenswert?

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!

von Bort M. (bort)


Lesenswert?

Danke für den Tipp, ich habe so etwas schon befürchtet. Gibt es da evt 
auch eine recht effektive Methode?

Grüße

von Bort M. (bort)


Lesenswert?

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!

von Stefan (Gast)


Lesenswert?

>Gibt es da evt auch eine recht effektive Methode?

Für was ?
RAM reservieren, Stack unter Kontrolle halten, Flash beschreiben, ...???

von Stefan (Gast)


Lesenswert?

>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!

von Bort M. (bort)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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.

von Alf (Gast)


Lesenswert?

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".

von Bort M. (bort)


Lesenswert?

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.ä.?

von Bort M. (bort)


Lesenswert?

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 :)!

von Stefan (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.