www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Information Memory beim MSP430F2013


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Gerd (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
// Segment D: 0x01000 - 0x0103F
// Segment C: 0x01040 - 0x0107F
// Segment B: 0x01080 - 0x010BF
// Segment A: 0x010C0 - 0x010FF
Leider finde ich dazu im DB nichts, ist theoretisch auch egal, würde 
mich aber dennoch interessieren.

Autor: Jörg S. (joerg-s)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>Liegt Segment A daher ganz hinten?
Ja

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

Autor: Qwerty (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Gregor B. (gbo)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Im Datenblatt steht nichts, aber hier
http://www.ti.com/general/docs/lit/getliterature.t...
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...

Autor: Gerd (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Gerd (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Oder immer ein Segment freihalten und die Daten da rüber schieben? Und 
dann wieder zurück...

Autor: Jörg S. (joerg-s)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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....

Autor: Gerd (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Jörg S. (joerg-s)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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_F...

Autor: Gerd (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Dosmo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Gerd (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: TL431 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>Gibt es da irgendeine Anweisung für den Compiler?
Bei IAR Compiler?
Project -> Options -> FET Debugger ->

Autor: Gerd (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
TL431 schrieb im Beitrag #2648753:
> Project -> Options -> FET Debugger ->

Alles klar, habs gefunden! Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net