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!!
@ 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
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?
@ 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
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
>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
ändernin
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
constConst_1=0x0001;
4
constConst_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!
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
constConst_1=0x0001;
4
constConst_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
>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:
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?!?
@ 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
>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.
@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)
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.