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