Hi, mache gerade meine ersten Schritte mit IRQs auf dem STM32. Im Cortex M3 Programming Manual steht When the processor takes an exception, unless the exception is a tail-chained or a latearriving exception, the processor pushes information onto the current stack. This operation is referred as stacking and the structure of eight data words is referred as stack frame. The stack frame contains the following information: ● R0-R3, R12 ● Return address ● PSR ● LR. Was aber ist mit den anderen Registern? Wenn ich mir den Assembler Code meines Crossworks Compilers anschaue sichert der immer noch R7. Muss ich die restlichen Register von Hand sichern, damit mein Hauptprogramm nicht gestört wird? Gruß Tom
Du willst den doch nicht ernsthaft in Assemler programmieren? Überlasse das den alles den C-Compiler, der sichert schon das was notwendig ist...
Thomas Burkhart schrieb: > Muss ich die restlichen Register von Hand sichern, damit mein > Hauptprogramm nicht gestört wird? Nein, solange du kein Assembler nutzt und Register nutzt, die nicht verwendet werden sollten. Der C-Compiler "weiß" was für Register er verwenden darf.
Woher weiß er das? Woher weiß er welche Register in meinem Hauptprogramm gerade benutzt wurden wenn der Interrupt kommt? Beim STM32 werden Interrupthandler ja nicht einmal speziell für den Compiler gekennzeichnet. Gruß Tom
Thomas Burkhart schrieb: > Beim STM32 werden Interrupthandler ja nicht einmal speziell für den > Compiler gekennzeichnet. Beim CM3 ist das in die Hardware gegossen. Exceptions aller Art sichern automatisch hardwaremässig alle Register, die eine aufgerufene Funktion nicht schon selbst sichert. Das sind die oben angegebenen Register. Allen anderen Register werden vom Handler selbst gesichert. In C macht das der Compiler für dich ganz automatisch, weil das nicht nur für Interrupt-Handler gilt, sondern für alle Funktionen.
Ähm, demnach müsste der C compiler aber für jede Funktion alle restlichen register sichern, das macht er aber nicht, lediglich R7 wird vom Handler gesichert. Da fehlen ja noch R4-R6 und R8-R11.
Thomas Burkhart schrieb: > Ähm, demnach müsste der C compiler aber für jede Funktion alle > restlichen register sichern, das macht er aber nicht, lediglich R7 wird > vom Handler gesichert. Da fehlen ja noch R4-R6 und R8-R11. Werden die denn vom Handler überhaupt verwendet?
Bingo! Ok, er muss natürlich nur die sichern, die überschrieben werden könnten. Stand auf der Leitung. D.h. er sichert demnach alle register die maximal im Handler verwendet werden könnten. Wie viele tatsächlich bei einem Aufruf verwendet werden kann ja ne nach Programmpfad variieren.
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.