[AVR-GCC] gcc "rettet" ungültige Register?!

Gast #2666429
Lesenswert?

Hi.

Umgebung: AVR Studio 5, avr gcc 4.5.1, Target: ATmega1284P

Mir ist aufgefallen, dass der "Stack-Verbrauch" durch gcc im Prolog von 
meinen Interrupt-Routinen größer ist, als er eigentlich sein sollte.

Erwartet hatte ich max. 33 Bytes, die der gcc sichert: r0...r31 + SREG.
Tatsächlich legt der Compiler mir in allen Optimierungsstufen 34 Bytes 
auf den Stack.
Das sieht dann in etwa so aus:
1
000000E8 1f 92                PUSH R1    Push register on stack 
2
000000E9 0f 92                PUSH R0    Push register on stack 
3
000000EA 0f b6                IN R0,0x3F    In from I/O location 
4
000000EB 0f 92                PUSH R0    Push register on stack 
5
000000EC 0b b6                IN R0,0x3B    In from I/O location 
6
000000ED 0f 92                PUSH R0    Push register on stack 
7
000000EE 11 24                CLR R1    Clear Register 
8
000000EF 2f 92                PUSH R2    Push register on stack 
9
...

oder wahlweise auch das Äquivalent
1
000000E4 00 90 5b 00          LDS R0,0x005B    Load direct from data space 
2
000000E6 0f 92                PUSH R0    Push register on stack

Wie erwartet holt der gcc das SREG aus 0x3F und sichert es auf dem 
Stack. - Nur, dasselbe macht er mit dem IO-Register 0x3B, und dieses 
Register ist im Atmel Datenblatt als "reserved" gekennzeichnet; sollte 
also eigentlich nicht verwendet werden.

Weiß jemand, wofür das gut sein soll, bzw. was es mit diesem IO-Register 
auf sich hat?
Lässt sich das irgendwie abstellen, ohne den gcc zu patchen?

Bin dankbar für jede Erleuchtung diesbzgl. :-)

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