www.mikrocontroller.net

Forum: Compiler & IDEs Fehler in GCC?


Autor: Fehlersuchender (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
/* epilogue: frame size=6 */
        adiw r28,6
        in __tmp_reg__,__SREG__
        cli
        out __SP_H__,r29
        out __SREG__,__tmp_reg__
        out __SP_L__,r28
        pop r29
        pop r28
        ret
/* 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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fehlersuchender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ging aber flott. Danke für die Antwort.

Kann man das auch irgendwo nachlesen?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.