Fehler in GCC?

Gast #841343
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren