2017-01-09 7 views
0

Ich habe gerade eine Funktion auf eine bestimmte Adresse mit einem Abschnitt platziert und dann gebe ich die Adresse dieser Funktion und das Ergebnis ist die gewählte Abschnitt Adresse + 1. Das ist, was ich getan habe:GCC erzeugt unausgerichtete Funktionsadresse auf Cortex M3

void __attribute__((section (".my_fct_address"))) Fct_Ptr_Test (void) 
{ 
... 
} 

und

void (*fct_ptr) (void); 
fct_ptr = Fct_Ptr_Test; 
printf ("0X%X\r\n", (uint32_t)(fct_ptr)); 
fct_ptr(); 

in ld-Datei:

.my_fct_address 0x800F000 : 
{ 
    KEEP(*(.my_fct_address)) /* keep my variable even if not referenced */ 
} > FLASH 

Die oben printf Anweisung Ausgänge 0x800F001 und Fct_Ptr_Test richtig

genannt Wenn ich

gesetzt
fct_ptr = 0x800F000; 

das System abstürzt. Wenn ich

fct_ptr = 0x800F001; 

gesetzt ist alles wieder in Ordnung. Wenn ich Fct_Ptr_Test nicht in einem eigenen Bereich platziere, also den Linker irgendwo platzieren lasse, bekomme ich auch eine ungerade Adresse. Jetzt frage ich mich, wie 0x800F001 eine richtige Adresse auf einem 32-Bit-Controller (ARM Cortex M3) sein kann und was in 0x800F000 gespeichert ist. Noch seltsamer: map-Datei zeigt immer die geraden Adressen Kann jemand helfen?

Dank

Martin

+0

Völlig unabhängig von Ihrer Frage und Problem, aber die portable Möglichkeit, einen Zeiger mit 'printf' zu drucken, ist mit dem' "% p" 'Format. Es erfordert, dass das Argument ein "void" ist. –

Antwort

2

Linker setzt das am wenigsten signifikantes Bit Thumb Funktionen 1 (siehe docs) zu erleichtern Interworking. Vielleicht ist das dein Fall?

+0

Hi yugr, ja ich denke, das ist es. Vielen Dank auch für den Link. Martin –

+0

Es ist definitiv der Fall! –

+1

Um es anders zu sagen, da es nicht auf einer Nur-Daumen-Maschine (cortex-m3) arbeitet, erwarten einige Anweisungen wie bx und pop, dass der lsbit für thumb-basierte Verzweigungs- oder Rücksprungadressen gesetzt wird. Siehe die BX-Anweisungsdokumentation. –

Verwandte Themen