mikrocontroller.net

Forum: Compiler & IDEs ARM GCC literal pool needs to be closer


Autor: Microman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin gerade dabei Software für das AT91SAM9263EK-Board zu schreiben. Ich 
nutze den GNU-Compiler aus dem Yagarto-Paket mit Version:

binutils: 2.17
gcc:      4.1.1
newlib:   1.14.0
insight:  6.5.50.20060612

Dabei bekomme ich ab einer gewissen Projektgröße folgenden Error:

Assembler message: invalid literal constant: pool needs to be closer.

Wenn ich die Prokektgröße reduziere verschwindet der Fehler wieder.
Meine Frage ist ob jemand weiß was zu tun ist um dieses Problem zu 
lösen.

Über Vorschläge wäre ich super dankbar.

Beste Grüße

Microman

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe zwar nie was mit dem ARM gemacht, aber aus der Fehlermeldung 
und den von Dir beschriebenen Symptomen würde ich darauf tippen, daß mit 
PC-relativen Offsets gearbeitet wird und dieser Offset zu groß geworden 
ist.

Wenn z.B. ein Maschinenbefehl PC-relativ mit sagen wir 10 bit Offset 
arbeitet, dann kann die Zieladresse nur innerhalb von 4 K um den 
aktuellen Programmzähler liegen.

Da der Compiler nichts über die tatsächlichen Adressverhältnisse weiß, 
setzt er eine symbolische Adresse in den relativ adressierenden Befehl 
ein und der Assembler merkt dann, daß das garnicht geht.

Wie Du das Problem praktisch lösen kannst, weiß ich nicht, aber 
vielleicht kannst Du in den Manuals was zu diesem Thema finden, was 
weiter hilft.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ARM versucht, Code zu sparen, indem Konstanten nicht im Befehl 
gespeichert werden, sonderen nur der Offset zur Konstanten. In der Regel 
werden dann diese Konstanten hinter der Funktion gespeichert.

Es könnte aber sein, daß Du ne Monsterfunktion mit riesen Spaghetticode 
hast und dann werden die 4k Offset überschritten.

Oder sie werden am Ende des Objekts abgelegt und das Objekt ist zu groß.

Aufteilen in mehrere Unterfunktion bzw. Objekte sollte helfen.


Peter

Autor: Microman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten,

habe jetzt eine Lösung für mein Problem gefunden, die ich nur mal 
schnell noch posten wollte. Vielleicht hilft sie ja jemandem weiter der 
auch das Problem hat. Mit der Option " -ffunction-sections " bei den 
CCFLAGS weist man den Compiler an den Pool für jede Funktion separat 
direkt hinter dieser anzulegen. Dabei darf dann eine einzelne Funktion 
nicht größer als 4k werden, da sonst der Offset zum Adressieren nicht 
mehr ausreicht.


Mfg

Microman

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.