Habe folgende Frage
Ich möchte gerne, dass eine Variable vom linker an eine bestimmte
Adresse gemappt wird.
Gibt es eine Möglichkeit dies dem GCC mitzuteilen?
Ich weiss, dass ich mit (adresse)* auf einen speicherbereich zugreifen
kann. Dies ist jedoch nicht das was ich möchte. Denn in diesem Fall kann
es ja sein, dass dieser Speicherplatz bereits von etwas anderem belegt
wird...
Danke schonmal
Neue Section im linkerscript anlegen und deinem Kompiler über ein
Attribut mitteilen, das er die variable in der section platzieren soll.
Linkerscript und die Attributdefinitionen hängen vom Compiler ab.
Wenn du uns deine Anwendung und deine Plattform/Toolchain/Compliler
mitteilst, kann dir besser geholfen werden.
Arduino Fanboy D. schrieb:> Woher weist du, dass der Kompiler deine Wunschadresse nicht noch> für andere Zwecke verwendet?
Genau das ist ja das problem...
Wenn du c++ verwendest kannst du dir "placement new" mal anschauen.
Kommt ganz ohne Pragmas oder den linker aus und funktioniert daher auf
jedem Compiler Out of the Box.
John schrieb:>> Woher weist du, dass der Kompiler deine Wunschadresse nicht noch>> für andere Zwecke verwendet?>> Genau das ist ja das problem...
Ja dann lass das doch bleiben! Wenn du nicht weißt, ob die Adresse frei
ist, hast du auch keinen guten Grund, die Variable ausgerechnet dorthin
zu legen.
Matthias S. schrieb:> Wenns nur eine Variable ist, kann man evtl. auch ein Register dafür> verwenden
Die Wahrscheinlichkeit, dass die Firmware des ESP8266 ein Register
unbenutzt lässt, geht gegen Null.
Stefan F. schrieb:> keinen guten Grund
Das würde mich auch interessieren, das Endziel der Übung...
Der Sinn, der Zweck, der Grund, warum das muss.
z.B. eine Begründung, warum malloc() und Pointer nicht reichen.
Dann könnte man evtl. eine Alternative benennen.
Ok ich habs verbokt liebe leute... eigentlich wollte ich eine konstante
an einer bestimmten adresse im flash abspeichern. Keine variable.
Asche auf mein Haupt. Sorry, dass ich mich so undeutlich ausgedrückt
habe...
Also: ich möchte mit meinem programm immer an der selben adresse nach
abgleichwerten zugreifen können. Die abgleichwerte werden zuvor durch
eine externe applikation in mein firmware image geschrieben und dann das
image geflasht.
Die firmware soll dann zb an addr 0x1234 auf die kalibwerte zugreifen...
Du kannst im Linker Script einfach ein Teil des Flash Address Bereiches
auslassen. Der Linker und Compiler ignoriert diesen Bereich dann
komplett.
Du kannst dann mit dem Flash Bereich machen, was Du willst.
Ist ein bischen frickelig, wenn sich der Speicherbereich in der Mitte
des Flash Addressraums befindet. Dann musst Du die beiden Segmente, die
für Code genutzt werden Gruppieren. Geht, nervt aber.
Besonders wird es, wenn Du Deinen reservierten Bereich einfach an das
Ende des Flash legst. Dann brauchst Du nur die Größe des Flash Speichers
im Linkerscript reduzieren und gut ist.
John schrieb:> ich weiss, dass ich mit (adresse)* auf einen speicherbereich zugreifen> kann. Dies ist jedoch nicht das was ich möchte. Denn in diesem Fall kann> es ja sein, dass dieser Speicherplatz bereits von etwas anderem belegt> wird
Nein.
Das ergibt keinen Sinn. Wenn du eine Variable fest an eine Adresse
binden willst, dann ist das typisch ein IO-Register. Auf jeden Fall eine
Adresse außerhalb des Datensegments (das vom Compiler verwaltet wird).
Es gibt schlicht keinen Grund, eine Adresse innerhalb des
Datensegments fest für eine Variable reservieren zu wollen. Deswegen
kann es auch eine derartige Kollision nicht geben.
Und falls doch, dann soltest du jetzt eine Begründung liefern. Und
zwar eine verdammt gute.
Für alle praktischen Fälle reicht ein bißchen Makro-Magie, um Zugriffe
auf Speicher an einer festen Adresse wie einen normalen Variablenzugriff
aussehen zu lassen. Die Headerfiles, die die IO-Register eines µC
definieren, geben genügend Hinweise darauf, wie man das richtig macht.
(Zeitüberschneidung)
John schrieb:> .. eigentlich wollte ich eine konstante> an einer bestimmten adresse im flash abspeichern. Keine variable
Vollkommen egal. Warum muß deine Konstante an einer bestimmten Adresse
liegen? In C ist das Konzept "Adresse" weitgehend überholt und wird
abgelöst von "Variablenname". Bzw. in dinem Fall Konstantenname.
Jede Variable (oder benannte Konstante) bekommt vom Compiler ein Symbol
zugewiesen und ist über den Symbolnamen nicht nur aus C, sondern auch
aus Assembler problemlos zu erreichen. Es gibt genau gar keinen Grund,
den Speicherort händisch festlegen zu wollen. Überlaß das dem Compiler.
Einer schrieb:> Speichere vor deiner Konstante eine magic number ab.> Die kannst du dann mit deiner externen Applikation> im Image suchen und ändern.
Blöde Idee, denn man kann bei Flash immer nur einen ganzen Sektor
löschen.
Außerdem kann Dir dann der Optimizer dazwischen funken.
Besser ist das Reservieren eines Flash Sektors (oder mehrere) im Linker
Skript. Entweder am Ende (s.o.) oder hinter den Interrupts, die ja
meistens am Anfang des Flash stehen und i.d.R. ohnehin gesondert
behandelt werden.
Jim M. schrieb:> Blöde Idee, denn man kann bei Flash immer nur einen ganzen Sektor> löschen.
Nicht richtig gelesen.
Er wollte das vorm flaschen per Programm patchen.