Hallo allerseits, momentan programmiere ich einen R8c/13 von Renesas mit der IDE von IAR. Im ROM möchte ich ganz einfach ein Datum, Name usw. als String stehen haben. #pragma memory = constseg(INFORMATION) const char text[] = {"hermann"}; #pragma memory = default Leider optimiert mir der Linker den Text immer weg, da ich ihn ja sonst nicht benutze. Kann mir vielleicht jemand sagen, wie ich den Kerl davon überzeugen kann, das zu lassen? Danke im Voraus, Bernhard
Bau einen -wenn auch sinnlosen- Zugriff auf diese Variable in Dein Programm ein. Damit wird dem Linker vorgegaukelt, daß das Symbol erforderlich wäre, und schon dürfte der das "Wegrationalisieren" sein lassen.
const und volatile zusammen sind eigentlich ein Widerspruch. Geht das wirklich und hilft es dann auch?
Danke für eure schnellen Antworten. @ Rufus T. Firefly Stimmt, so klappt es. Aber ein so teures Tool kann doch nicht von mir verlangen, dass ich alle Manfrede mit irgendwelchen Heidruns vergleiche (oder irgendetwas anderes sinnloses), oder? @ OldBug "volatile" sagt mir nichts; Aber wenn ichs in allen möglichen Varianten um die Konstante herum schreibe passiert auch nichts.
"Leider optimiert mir der Linker den Text immer weg, da ich ihn ja sonst nicht benutze." Daß ein Linker etwas wegoptimiert, kann ich nicht so richtig glauben. Einmal erzeugte Objekte müssen auch plaziert werden. Nur aus Bibliotheken darf der Linker nur die benötigten Objekte auswählen. Ich vermute eher, der Compiler optimiert ihn schon weg. Schreibe den Text einfach in ein separates Object, dann darf er nicht wegoptimiert werden, da er ja von einem anderen Object benötigt werden könnte. Auch kann man ihn dann sogar immer an eine bestimmte Adresse linken lassen (z.B. 0x1000). Peter
Also nochmal als Zusammenfassung: * Volatile bringt mit oder ohne const nichts * Wenn ich auch nur auf ein byte des Texts zugreife, bleibt er da * Im Linker-Handbuch gibts wohl keine Lösung schade, aber DANKE AN ALLE
Ups, da habe ich wohl zu lange geschrieben. Entschuldige bitte, Peter, ich werde deinen Versuch natürlich machen.
Hallo, habe das Ganze so wie Du es geschrieben hast mal bei mir ausprobiert und der Linker optimiert meinen String nicht weg. Ich verwende allerdings einen H8 von Renesas mit der IAR-Umgebung (sollte hoffentlich vergleichbar sein). Bei mir sieht das dann so aus: C-File: #pragma memory = constseg(INFO) const char Info[] = {"Hallo"}; #pragma memory = default Linker-Options: LINKOPT += -Z(CODE)RCODE,CDATA0,CDATA1,CONST,CSTR,CCSTR,CODE,INFO=0100-DFFF Map-File: SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN ======= ===== ============= =========== ==== ==== ===== INFO 0000A59A - 0000A59F 6 rel 1 Hex-File: S113A59000036A8EFB53547040FE48616C6C6F007C Wie hast Du denn deine Linkeroptionen eingestellt? Viele Grüße, Ralf
Den Compiler habe ich jetzt einfach mal auf "no optimization" gestellt; So hat er wirklich jeden noch so sinnlosen Code mitübersetzt. War immer noch nichts.
Hallo Ralf, meine Linker-Optionen habe ich in der IDE eingestellt. Da gibts aber nichts auszuwählen, was auf Optimierung herauslaufen könnte. Nur Ausgangsformat (übrigens motorola), Ausgangsname, Fehlermeldungen und *.xcl-File. Im Anhang ist die *.xcl, die ich verwende. Um die habe ich mich bisher aber nicht gekümmert.
Hallo, hast Du mal versucht das Segment INFORMATION als CONST oder CODE zu definieren anstatt NEARCONST? Gruß, Ralf
Der Compiler kann das nicht wegoptimieren. Das Ding hat external scope, könnte also auch in einem anderen getrennt übersetzten Modul verwendet werden. Es ist allerdings nicht untypisch für moderne Compilersysteme, dass der Linker derartige Optimierungen durchführt. Ein Grund ist (ausserhalb der µC-Sphäre) der Trend zu C++, wo noch viel schlimmeres notwendig ist (wegoptimieren von zigfach identisch definierten Funktionen und Daten).
Hallo ihr alle, möchte nur schnell bescheidgeben, dass ich jetzt im langen Wochenende bin, am Montag gehts dann weiter. MfG, Bernhard
Hallo alle miteinander, @ Ralf Habe jetzt in das *.xcl-File //-Z(NEARCONST)INFORMATION=C000 -Z(CODE)INFORMATION=C000 hineingeschrieben (das alte auskommentiert). Auch CONST habe ich versucht. Leider hat's nichts gebracht. Schönen Start in die neue Woche wünsche ich, Bernhard
> const und volatile zusammen sind eigentlich ein Widerspruch.
Das nur am Rande: Es ist kein Widerspruch. Der Standard spricht nicht
umsonst von "cv-qualified" Variablen.
Zum Beispiel könnte man ein read-only-Register dem Compiler als const
volatile beibringen. Dann weiß der Compiler, dass er nichts optimieren
darf (volatile), es aber zusätzlich nur gelesen werden darf (const).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.