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