mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IAR Linker optimiert Text weg


Autor: Bernhard Gebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile?

Autor: Thomas Burkhardt (Gast)
Datum:

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

Autor: Bernhard Gebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard Gebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard Gebert (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard Gebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard Gebert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß,

Ralf

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Bernhard Gebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr alle,

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

MfG,
Bernhard

Autor: Bernhard Gebert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.