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. :-)