Fehler in GCC?

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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.