Forum: Compiler & IDEs Fehler in GCC?


von Fehlersuchender (Gast)


Lesenswert?

Hallo,

Wenn ich mir den output von GCC mit objdump ansehe, ist mir folgendes 
aufgefallen:

Wenn der Stack-Frame im Epilog von Funktionen zurückgesetzt wird
gibt GCC folgende Sequenz aus:
1
/* epilogue: frame size=6 */
2
        adiw r28,6
3
        in __tmp_reg__,__SREG__
4
        cli
5
        out __SP_H__,r29
6
        out __SREG__,__tmp_reg__
7
        out __SP_L__,r28
8
        pop r29
9
        pop r28
10
        ret
11
/* epilogue end (size=9) */

Der Sinn ist mir klar: Interrupt routinen sollten keinen inkonsistenten 
Stack pointer bekommen. Aber sollte das "out _SREG_,__tmp_reg__" nicht 
nach "out _SP_L_,r28" stehen?

Ich bekomme den besagten Code im gcc 4.1.2 mit den folgenden Optionen:

avr-gcc -mmcu=atmega16 -I. -fpack-struct -fshort-enums -fno-unroll-loops 
-Wall -Wstrict-prototypes -g

Ist das ein Compiler-Fehler oder hat der AVR eine "latenz" bein 
Schreiben von SREG, die einen Unterbrechung erst nach "out _SP_L_,r28" 
ermöglicht?

von Benedikt K. (benedikt)


Lesenswert?

Die Interrupts werden einen Takt nach dem Schreiben von SREG aktiviert. 
Das ist auch der Grund, warum ein AVR nach reti mindestens 1 Takt vom 
normalen Code ausführt, ehe der nächste Interrupt gestartet werden kann.

von Fehlersuchender (Gast)


Lesenswert?

Das ging aber flott. Danke für die Antwort.

Kann man das auch irgendwo nachlesen?

von Benedikt K. (benedikt)


Lesenswert?

Irgendwo im Datenblatt steht was dazu, aber ich habs auf die schnelle 
nicht gefunden.

von Peter D. (peda)


Lesenswert?

Fehlersuchender wrote:
> Das ging aber flott. Danke für die Antwort.
>
> Kann man das auch irgendwo nachlesen?

Ja, in der Doku zum AVR-GCC in den FAQs.


Peter

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.