White_fox, deinen Interrupthandler zu definieren geht so:
Nehmen wir an du möchtest für dem TIM7 einen Handler schreiben.
In deinem Projektordner befindet sich die Datei "startup_stm32f44axx.s", ja genau "*.s", eine Assembler Datei.
In dieser Datei wird die Interrupt-Vektor-Tabelle definiert. Das ist eine Tabelle mit 96 Funktionszeigern vom Typ
Code:
void (*handler)(void);
Also kein Rückgabewert und keine Parameter.
Diese Namen, die in dieser Datei stehen, sind die Symbole die du suchst, für die du eine C-Funktion mit genau dem Namen einmal in deinem Code definieren mußt.
Für Timer 7 schreibst du z.B. in deine "main.c"
Code:
void TIM7_IRQHandler(void) {
/* dein Code */
}
Wie wird das jetzt aufgelößt beim Build?
Zuerst macht der Assembler aus der startup Datei eine Objekt-Datei. In dieser *.o steht jetzt in der Symboltabelle das Symbol "TIM7_IRQHandler". Das Besondere ist, dass dieses Symbol als schwach (weak) markiert ist.
Der Compiler übersetzt nun deine "main.c" und macht daraus "main.o". In der Symboltabelle dieser Datei befindet sich ebenfalls das Symbol "TIM7_IRQHandler" - aber - dieses ist _nicht_ als schwach makiert.
Jetzt baut der Linker aus beiden "*.o"-Dateien eine Datei zusammen und muss die Symbole auflösen. Dabei stösst er auf die Tatsache, dass es zweimal das Symbol "TIM7_IRQHandler" gibt. Normalerweise ist das ein Konflikt, der zu einem Fehler führt. Hier aber kommt die schwache Markierung aus der ersten Objektdatei ins Spiel: Das erste Symbol aus "startup_stm32f446xx.o" wird durch das Symbol aus deiner "main.o" ersetzt. Sprich deine Funktion überschreibt die schwächere Definition aus der "startup_stm32f446xx.s".
Für andere Handler schaust du in Zukunft in die Tabelle von "startup_stm32f446xx.s" rein, nimmst den Symbolnamen und schreibst dafür eine C-Funktion mit genau diesem Namen.
Gruss botty
Lesezeichen