Forum: Mikrocontroller und Digitale Elektronik Information Memory beim MSP430F2013


von Gerd (Gast)


Lesenswert?

Hi Leutz!

Ich versuche mich gerade daran, Daten ins Flash vom MSP abzulegen. 
Klappt auch, aber ich stolpere über die seltsame Verteilung des 
Information Memorys im Controller.

Laut DB ist dieser Speicherbereich zwischen 0x01000 und 0x010FF, also 
256Byte. Dieser Bereich ist unterteilt in Segment A bis D. In A liegen 
die Kalibrierdaten für den DCO, dieser Bereich ist gesondet gesichert 
und muss erst freigeschaltet werden. Ist auch egal, ich will den 
garnicht benutzen.

Normalsterblicher würde ja jetzt davon ausgehen, dass Segment A bei 
0x1000 beginnt, das scheint aber nicht so zu sein, da auf diesen Bereich 
halt nicht ohne geschrieben werden kann, das Auslesen bringt 
hauptsächlich 1en, Speicher ist also größtenteils leer. Ab 0x1040 kann 
dann ohne Probleme geschrieben werden.

Liegt Segment A daher ganz hinten? Also alles umgekehrt? So:
1
// Segment D: 0x01000 - 0x0103F
2
// Segment C: 0x01040 - 0x0107F
3
// Segment B: 0x01080 - 0x010BF
4
// Segment A: 0x010C0 - 0x010FF
Leider finde ich dazu im DB nichts, ist theoretisch auch egal, würde 
mich aber dennoch interessieren.

von Jörg S. (joerg-s)


Lesenswert?

>Liegt Segment A daher ganz hinten?
Ja

>Leider finde ich dazu im DB nichts
Schau in den User Guide :)

von Qwerty (Gast)


Lesenswert?

Das ist in der Tat so, jedenfalls steht es so in der z.B. slau144.pdf. 
Also Segment D beginnt tatsächlich bei 0x01000. Das findet man dann 
immer in der familiy guide zur jeweiligen MCU ...

Qwerty

von Gregor B. (Gast)


Lesenswert?

Im Datenblatt steht nichts, aber hier
http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=slau144i&fileType=pdf
auf Seite 317.

Da siehst Du, dass Segment A tatsächlich oben im Speicher liegt und 
Segment D unten, anders als erwartet.

Übrigens beim Main Memory liegt Segment 0 genz oben und Segment 63 ganz 
unten.

Letztlich nur eine Definition.

Es geht übrigens auch noch schlimmer:

Freescale PowerPC (z.B. MPC823E)

- Externes Businterface mit 26 Adressleitungen, A6 bis A31, wobei A6 die 
höchstwertige Adressleitung ist...

von Gerd (Gast)


Lesenswert?

Vielen Dank!

Da stehts drin, tatsächlich ;-)

Mal noch ne andere Sache: Ich schreibe ins Flash, sagen wir ein Wort1 an 
Speicherstelle x. Danach das nächste Wort2 an x+2, usw...

Jetzt ändert sich während des Programms Wort1 und muss daher neu ins 
Flash gespeichert werden - kann ich das einfach überschreiben? Oder MUSS 
die Speicherstelle erst wieder gelöscht werden?

Das ist doch generell ein Problem, das sich mir grad auftut...Ich kann 
ja nur Segmentweise löschen, ich müsste also erst das ganze Segment 
zwischenspeichern (64Byte bei 128Byte RAM), um dann alles 
zurückzuschreiben.

Wie soll ich das denn machen?

von Gerd (Gast)


Lesenswert?

Oder immer ein Segment freihalten und die Daten da rüber schieben? Und 
dann wieder zurück...

von Jörg S. (joerg-s)


Lesenswert?

> Jetzt ändert sich während des Programms Wort1 und muss daher neu ins
> Flash gespeichert werden - kann ich das einfach überschreiben? Oder MUSS
> die Speicherstelle erst wieder gelöscht werden?
Es geht immer nur ein eine Richtung. Ich weiss jetzt nicht wie es bei 
MSP ist, aber sagen wir mal das Flash lässt sich nur einmalig auf 0 
setzen. Dann kannst du aus 0xF0 noch eine 0x00 machen ohne vorher zu 
löschen. Aus einer 0x00 kannst du aber keine 0x01 mehr machen.


> Das ist doch generell ein Problem, das sich mir grad auftut...Ich kann
> ja nur Segmentweise löschen, ich müsste also erst das ganze Segment
> zwischenspeichern (64Byte bei 128Byte RAM), um dann alles
> zurückzuschreiben.
Ja, das ist halt Flash Speicher....

von Gerd (Gast)


Lesenswert?

Jörg S. schrieb:
> Ja, das ist halt Flash Speicher....

Dann muss ich doch mal ganz dumm fragen, wie das bei einem USB-Stick 
gelöst ist? Das ist doch auch Flash. Bleibt da auch ein Segment immer 
frei, in dem man "arbeiten" kann, oder wie ist das?

von Jörg S. (joerg-s)


Lesenswert?

In den USB Sticks ist ja auch ein Controller drin der das alles steuert 
und optimiert.
Siehe:
http://de.wikipedia.org/wiki/Wear-Leveling#Reine_Flash-Laufwerke

von Gerd (Gast)


Lesenswert?

OK, das werde ich mir mal durchlesen - danke!

Nochwas: Wie gesagt, das Schreiben klappt ja ohne Probleme. Wie kann ich 
denn dem Compiler (IAR) sagen, dass er mir nicht jedesmal den 
Information Memory löscht? Ich will ja testen, ob die Werte da auch drin 
bleiben. Nur dazu muss ich momentan immer sagen, dass er die erst da 
rein schreiben soll.

Das Kompilieren schmeißt ja auch den Speicherbereichsinhalt wieder raus 
und setzt alles auf 0xFF.

Gibt es da irgendeine Anweisung für den Compiler?

von Dosmo (Gast)


Lesenswert?

Gerd schrieb:
> Mal noch ne andere Sache: Ich schreibe ins Flash, sagen wir ein Wort1 an
> Speicherstelle x. Danach das nächste Wort2 an x+2, usw...
>
>
> Jetzt ändert sich während des Programms Wort1 und muss daher neu ins
> Flash gespeichert werden - kann ich das einfach überschreiben? Oder MUSS
> die Speicherstelle erst wieder gelöscht werden?

Wenn Du eine solche Anwendung hast, ist Flash ungeeignet. Dafür eignet 
sich ein EEPROM viel besser, weil es byteweise gelöscht werden kann.

Ansonsten gibt es sog. "EEPROM-Emulation" im Flash, d.h. ein 
Software-Algorithmus simuliert ein EEPROM, benutzt aber Flash zum 
Speichern. Sowas ist aber nicht trivial und braucht mehrere Instanzen 
des Datensatz im Flash, von denen immer nur eine gültig ist.

von Gerd (Gast)


Lesenswert?

Dosmo schrieb:
> Wenn Du eine solche Anwendung hast, ist Flash ungeeignet. Dafür eignet
> sich ein EEPROM viel besser, weil es byteweise gelöscht werden kann.

Ja klar, nur leider ist das hier grad nicht drin. Es sind nur ein paar 
Werte, die ich speichern muss, dafür jetzt extra ein EEPROM...ich werde 
die Daten dann irgendwie zwischen zwei Segmenten hin und her kopieren 
und dazwischen eben immer ein Segment löschen.

von TL431 (Gast)


Lesenswert?

>Gibt es da irgendeine Anweisung für den Compiler?
Bei IAR Compiler?
Project -> Options -> FET Debugger ->

von Gerd (Gast)


Lesenswert?

TL431 schrieb im Beitrag #2648753:
> Project -> Options -> FET Debugger ->

Alles klar, habs gefunden! Danke!

von Pali64 (Gast)


Lesenswert?

AU das tut Wehh :-(

Ich programmiere MSP430er in purem Assembler seit es sie Gibt....
Habe mich doch Tasächlich mal aus der TI umgebung raus gewagt (Segmente 
haben mich da nicht gekümmert da die xxx430Cxxxx versionen keinen 
Haben)und den IAR zu verwenden. Bin doch tatsächlich dauernd darüber 
gestolpert dass ich im IAR "SEGMENTB" beschreiben will und dies dan 
offensichtlich im Segment C gesucht GRMPF :@

Jungs ich will euch einfach DANKE sagen habe dank diesem Beitrag lesen 
endlich gefunden warum meine Parameter immer weg waren :-)

Jaja Handbuchlesen ist halt so ne Sache.. wen mann so Lange 
eingefleischt Assembler programmiert und sich darauf spezialisiert hat 
möglichst viele Funktionen in nur 2 K FLASH(MSP430F2013) zu 
briingen.....


Desshalb nochmals DANKE für eure Beiträge hat mich nach 2Std suchen via 
Google in 5 Minuten zum "Ahaaa" effekt geführt :-)

Grüsse vom Assembler(ALT)hasen ;-)

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.