2016-04-20 7 views
0

Ich versuche, diese Inline-Code für ARMV4T Chip zu kompilieren,GCC: ungültige literale Konstante: Pool muss näher

asm ("LDR R2, =a1"); 

gcc antwortet, dass

ungültig literale Konstante: Pool näher sein muss

Ich habe versucht, a1 in der Nähe der Funktion zu bewegen, aber immer noch den gleichen Fehler.

Wie behebt man diesen Fehler?

+0

'a1' ist ein Registername; Können Sie ein anderes Etikett ausprobieren, um zu sehen, ob es funktioniert? Meinst du eine Bezeichnung oder den Wert '0xa1'? Sie können 'asm (" ldr r2, = a1 \ nb 1f \ n .ltorg \ n 1: \ n ")' verwenden, was immer funktionieren sollte, aber normalerweise brauchen Sie das nicht. –

+0

Da Sie gcc verwenden, wie wäre es mit erweiterten asm und Auflisten von a1 als Eingabe? –

Antwort

0

Just von der ARM-Website gestohlen (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0041c/Babbfdih.html):

Die vom PC auf den Wert im wörtlichen Pool Offset muss als 4 KB kleiner sein. Sie sind dafür verantwortlich, dass ein Literalpool in Reichweite ist. Weitere Informationen finden Sie in der LTORG-Richtlinie.

so möglicherweise die Variable a1 irgendwo außerhalb dieses 4k definiert ist, ist es das, was der Assembler als ungültig betrachtet, so dass es die Fehlermeldung erzeugt.

Es gibt eine Menge mehr Infos unter http://www.freertos.org/FreeRTOS_Support_Forum_Archive/February_2006/freertos_ARM_Error_invalid_literal_constant_pool_nee_1448037.html und ARM + gcc: don't use one big .rodata section

Einige andere Quellen (http://www.mikrocontroller.net/topic/68111 - German) legen nahe, dass das Flag -ffunction-sections sollte der Compiler hinzugefügt werden.

+0

Vielen Dank für Hilfe. Das Hinzufügen von -ffunction-sections Flags funktioniert für mich bisher, aber .ltorg funktioniert nicht. – wxie

Verwandte Themen