Forum: Mikrocontroller und Digitale Elektronik MSP430F1611 Flashwrite / Erase /.


von Hase (Gast)


Lesenswert?

Hallo Leute,

habe da ein paar Fragen zum Schreiben bzw. Löschen des Flash:

1. was ist das Info-Memory, welche Informationen enthält es und wer 
braucht diese Infos wozu?

2. woher weiß ich an welche Adressen ich meine Daten schreiben kann und 
welche bereits vom Programm belegt sind?

3. Die Daten, die ich zur Laufzeit ins Flash schreiben will, möchte ich 
auch schon beim Laden des Programms via JTAG ins Flsh praktizieren - wie 
geht das?

Wäre echt super, falls jemand mir helfen könnte!! DANKE!!

von Falk B. (falk)


Lesenswert?

@ Hase (Gast)

>1. was ist das Info-Memory, welche Informationen enthält es und wer
>braucht diese Infos wozu?

Das ist ein logisch getrennter, kleiner FLASH-Breich. Dort kann man 
Einstellungen etc. speichern. Der Vorteil ist, dass man es beschrieben 
kann, wenn das normale Programm im restlichen Flash läuft.

>3. Die Daten, die ich zur Laufzeit ins Flash schreiben will, möchte ich
>auch schon beim Laden des Programms via JTAG ins Flsh praktizieren - wie
>geht das?

Einfach reinschreiben.

MFG
Falk

von Hase (Gast)


Lesenswert?

Vielen Dank!

1. Info Memory: schreibt man in dieses Memory genauso wie in den Rest 
des Flash bzw. wie in dem Beispiel von TI angegeben? Steht da schon was 
wichtiges drin oder steht es ganz zur Verfügung des Programmierers?

2. Ich verwende einen C-Compiler (Code Composer), wie kann ich da 
festlegen was wohin geschrieben wird? Kann ich auch das Info-Memory beim 
laden des Programms mittels JTAG gleich mitbeschreiben?

von Falk B. (falk)


Lesenswert?

@ Hase (Gast)

>1. Info Memory: schreibt man in dieses Memory genauso wie in den Rest
>des Flash bzw. wie in dem Beispiel von TI angegeben? Steht da schon was

Ja.

>wichtiges drin oder steht es ganz zur Verfügung des Programmierers?

Voll verfügbar.

>2. Ich verwende einen C-Compiler (Code Composer), wie kann ich da
>festlegen was wohin geschrieben wird?

Keine Ahnung.

> Kann ich auch das Info-Memory beim
>laden des Programms mittels JTAG gleich mitbeschreiben?

Denke schon.

MfG
Falk

von Hase (Gast)


Lesenswert?

Hallo Falk,

vielen Dank für diese Hinweise zu später Stunde! Werde also wohl das 
Info-Memory verwenden.

Den Rest weiß ja vielleicht auch noch jemand...

MfG
Hase

von Stefan (Gast)


Lesenswert?

>Steht da schon was wichtiges drin oder steht es ganz zur Verfügung des 
>Programmierers?
Bei Deinem F1611 ist es frei, bei den F2xxx stehen da einige 
Kalibrierwerte für DCO-Clock und für den AD-Wandler drinne. Wenn man 
diese braucht, darf man natürlich nichts anderes drüberflashen!
Man kann im INFO-Bereich aber auch Programmcode speichern lassen, man 
muss das nur den Linker wissen lassen, dass er den Bereich auch nutzen 
darf!
Beim IAR z.B. im Linker-File (.xcl) (Adressen für den F1611 anpassen!):
1
-Z(CODE)CODE=F800-FFDF
2
ändern in
3
-Z(CODE)CODE=1000-10FF,F800-FFDF

>Ich verwende einen C-Compiler (Code Composer), wie kann ich da
>festlegen was wohin geschrieben wird? Kann ich auch das Info-Memory beim
>laden des Programms mittels JTAG gleich mitbeschreiben?
Kenne den CC nicht, aber es wird wohl ähnlich funktionieren, wie beim 
IAR:
1
#pragma location="INFO"
2
__root
3
const Const_1 = 0x0001;
4
const Const_2 = 0x0002;   
5
...
Der INFO-Bereich wird im Linker-File definiert
Also z.B.
1
-Z(CODE)INFO=1000-10FF

>woher weiß ich an welche Adressen ich meine Daten schreiben kann und
>welche bereits vom Programm belegt sind?
Das sollte der Linker wissen!
Es sei denn, Du beschreibst das INFO nur zur Laufzeit ohne vorher 
Konstanten definiert zu haben, dann musst Du selbst aufpassen!

von Hase (Gast)


Lesenswert?

Hallo Stefan,

vielen herzlichen Dank für die ausführliche Antwort!

Gehe ich recht in der Annahme, daß
1
-Z(CODE)INFO=1000-10FF
eine CompilerOption ist, die dem Compiler sagt, daß der Speicherbereich 
von 1000 bis 10FF dem Bezeichner "INFO" zugeordnet ist? Kann ich diese 
Option einfach in den Progamcode einfügen?
1
#pragma location="INFO"
2
__root
3
const Const_1 = 0x0001;
4
const Const_2 = 0x0002;   
5
...
Was macht eigentlich "__root"? Die oben gezeigten Konstanten werden beim 
Laden des Programms in den Controller einfach in den Infobereich 
geschrieben? Wie praktisch!

Um etwas zur Laufzeit in den Infobereich schreiben zu können, benötige 
ich einen Pointer, der den Bereich adressiert. Wo bekomme ich den den 
her? Hat der einfach der Wert 0x1000?

Werd das gleich mal ausprobieren.

Beste Grüße
Hase

von Stefan (Gast)


Lesenswert?

>Gehe ich recht in der Annahme, daß
1
>-Z(CODE)INFO=1000-10FF
>eine CompilerOption ist,
Nein! Es ist keine Compileroption, sondern eine Linkeroption!

>die dem Compiler sagt, daß der Speicherbereich
>von 1000 bis 10FF dem Bezeichner "INFO" zugeordnet ist?
Nein! Sie sagt dem Linker, dass...

>Was macht eigentlich "__root"?
Erstmal eine Korrektur:
__root muss vor jeder Konstante stehen!
__root ist eine IAR-spezifische Option, die dem Compiler/Linker sagt, 
dass die jeweilige Variable/Konstante auf jeden Fall verwendet werden 
soll, auch wenn später im Programm u.U. gar nicht darauf zugefriffen 
wird. In dem Falle könnte es nämlich passieren, dass die Optimierung 
zuschlägt und die Variable/Konstante eben doch nicht angelegt und ins 
Flash programmiert wird!

>Um etwas zur Laufzeit in den Infobereich schreiben zu können, benötige
>ich einen Pointer, der den Bereich adressiert. Wo bekomme ich den den
>her? Hat der einfach der Wert 0x1000?
Die Adresse der Konstanten kannst Du frei wählen (im Bereich des 
INFO-Segments natürlich)
Oder aber du definierst eine Konstante:
1
#pragma location="INFO"
2
__root
3
const Const_1 = 0x0001;
und greifst dann auf die Adresse der Konstane zu:
1
p_pointer = &Const_1;

von Hase (Gast)


Lesenswert?

OK, VIELEN DANK! - ich habe inzwischen herausgefunden, daß INFOA und 
INFOB bereits als Adressen für die beiden Segmente des INFO-Bereichs 
definiert sind. Aber die Zuordnung mit dem #pragma funzt net! Im Code 
Composer Essentials (CC) muß das irgendwie anders laufen...

Auch ist mir nicht klar wie ich den Bereich begrenzen kann, der ins 
INFO-Memory geschrieben wird. Ich habe z.B. 20 globale Constanten 
angelegt, von denen aber nur 10 in den Infobereich sollen. Wie weiß der 
Compiler/Linker, wo die Liste der Constanten für den Infobereich zu Ende 
ist?!?

von Falk B. (falk)


Lesenswert?

@ Hase (Gast)

>angelegt, von denen aber nur 10 in den Infobereich sollen. Wie weiß der
>Compiler/Linker, wo die Liste der Constanten für den Infobereich zu Ende
>ist?!?

Das kann man auch per "Hand" machen.

- Alle Konstanten, die in den FLASH sollen in einem struct 
zusammenfasssen
- Einen Zeiger auf dieses Struct auf den Anfang von INFA oder INFOB 
legen
- über den zieger auf die Konstanten zugreifen

Das ist dann auch compilerunabhängig

MFG
Falk

von Stefan (Gast)


Lesenswert?

>aber die Zuordnung mit dem #pragma funzt net! Im Code
>Composer Essentials (CC) muß das irgendwie anders laufen...
Das ist wohl war ;-)

>Auch ist mir nicht klar wie ich den Bereich begrenzen kann, der ins
>INFO-Memory geschrieben wird. Ich habe z.B. 20 globale Constanten
>angelegt, von denen aber nur 10 in den Infobereich sollen. Wie weiß der
>Compiler/Linker, wo die Liste der Constanten für den Infobereich zu Ende
>ist?!?
Du wirst nicht darum herum kommen, Dir die Beschreibung zum CC 
durchzulesen, um herauszufinden, wie man derartige Direktiven definiert 
und setzt!
Beim IAR z.B. werden alle Konstanten standardmäßig im (Programm-)Flash 
abgelegt, ausser man definert für gewisse Konstanten eben einen 
anderen Bereich mit #pragma...
Es kann nun z.B. sein, dass beim CC diese Direktiven solange gelten, bis 
man wieder einen anderen Speicherbereich auswählt, oder aber man muss 
vor jede Konstante ein #pragma... setzen, die nicht im normalen 
Programm-Flash landen soll.

von Stefan (Gast)


Lesenswert?

@Falk
>Alle Konstanten, die in den FLASH sollen
Meinst Du jetzt Programm-Flash oder INFO-Flash?

>- Einen Zeiger auf dieses Struct auf den Anfang von INFA oder INFOB
>legen
>- über den zieger auf die Konstanten zugreifen
Selbst dann muss man dem Linker immer noch sagen, wohin er beim 
Programmieren die "struct" flashen soll (mit #pragma oder was auch 
immer beim CC)

von Hase (Gast)


Lesenswert?

ich habe mich entschieden, die betreffenden Konstanten in den 
INFO-Bereich zu flashen. Der ist groß genug.

von Hase (Gast)


Lesenswert?

die Idee mit dem #pragma vor jeder Konstante ist nicht schlecht - nur 
wie sieht dieses #pragma aus? das vom IAR erkennt CC nicht...

von Stefan (Gast)


Lesenswert?

>wie sieht dieses #pragma aus? das vom IAR erkennt CC nicht...
Doku zum CC lesen !!!

von Stefan (Gast)


Lesenswert?

#pragma DATA_SECTION(...)

von Stefan (Gast)


Lesenswert?

oder vielleicht doch besser #pragma CODE_SECTION(...) ?!

von Hase (Gast)


Lesenswert?

DATA_SECTION / CODE_SECTION klingt schon mal gut! habe ein pdf gefunden 
- nennt sich CC-user guide. mal sehen ob ich da was finde.

von HAse (Gast)


Lesenswert?

Der TI user guide ist leider auch keine große Hilfe! Kann da nichts 
finden...

Ich habe mir einige Beispiele mit CODE_SECTION(...) angeschaut, kann 
aber nicht erkennen, was CODE_SECTION eigentlich genau macht...

Ich brauche einfach einen Befehl (im source-code), der dem 
Compiler/Linker sagt, "schreibe den wert 0x018F an die Adresse X im 
Infobereich". Der Wert soll dann auch zwei Byte des Infobereichs 
belegen. Falls jemand eine solche Codezeile (für TI-Code Composer 
Essentials) schon mal gesehen oder gar verwendet hat, wäre es sehr nett, 
falls er diese Zeiel zur Verfügung stellt! Vielen Dank!

Die Geschichte zur Laufzeit sollte sich eigentlich aus dem TI-Beispiel 
zum Flash ergeben.

von Stefan (Gast)


Lesenswert?

>Der TI user guide ist leider auch keine große Hilfe! Kann da nichts
>finden...
Such mal bei TI nach: slau132a.pdf

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.