Forum: Mikrocontroller und Digitale Elektronik IAR Linker optimiert Text weg


von Bernhard Gebert (Gast)


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

von Rufus T. Firefly (Gast)


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.

von OldBug (Gast)


Lesenswert?

volatile?

von Thomas Burkhardt (Gast)


Lesenswert?

const und volatile zusammen sind eigentlich ein Widerspruch. Geht das
wirklich und hilft es dann auch?

von Bernhard Gebert (Gast)


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.

von Peter Dannegger (Gast)


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

von Bernhard Gebert (Gast)


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

von Bernhard Gebert (Gast)


Lesenswert?

Ups, da habe ich wohl zu lange geschrieben. Entschuldige bitte, Peter,
ich werde deinen Versuch natürlich machen.

von Ralf (Gast)


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

von Bernhard Gebert (Gast)


Lesenswert?

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.

von Bernhard Gebert (Gast)


Angehängte Dateien:

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.

von Ralf (Gast)


Lesenswert?

Hallo,

hast Du mal versucht das Segment INFORMATION als CONST oder CODE zu
definieren anstatt NEARCONST?

Gruß,

Ralf

von A.K. (Gast)


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

von Bernhard Gebert (Gast)


Lesenswert?

Hallo ihr alle,

möchte nur schnell bescheidgeben, dass ich jetzt im langen Wochenende
bin, am Montag gehts dann weiter.

MfG,
Bernhard

von Bernhard Gebert (Gast)


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

von Chris (Gast)


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

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.