IAR Linker optimiert Text weg

Gast #169511
Lesenswert?

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
Gast #169512
Lesenswert?

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.
Gast #169515
Lesenswert?

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.
Gast #169516
Lesenswert?

"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
Gast #169517
Lesenswert?

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
Gast #169519
Lesenswert?

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
Gast #169521
Lesenswert?

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.
Angehängte Dateien:
Gast #169523
Lesenswert?

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).
Gast #169525
Lesenswert?

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
Gast #169526
Lesenswert?

> 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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren