Forum: Mikrocontroller und Digitale Elektronik STM32: Muss man Register in Interuptfunktionen von Hand sichern?


von Thomas B. (escamoteur)


Lesenswert?

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

von Matthias K. (matthiask)


Lesenswert?

Du willst den doch nicht ernsthaft in Assemler programmieren?

Überlasse das den alles den C-Compiler, der sichert schon das was 
notwendig ist...

von 900ss (900ss)


Lesenswert?

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.

von Thomas B. (escamoteur)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Thomas B. (escamoteur)


Lesenswert?

Ä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.

von (prx) A. K. (prx)


Lesenswert?

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?

von Thomas B. (escamoteur)


Lesenswert?

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
Noch kein Account? Hier anmelden.