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?