AVR + IAR Compiler + CSTACK + pushen der Register verhindern

OP #909171
Lesenswert?

Hi Leute,

gibt es eine Möglichkeit dem IAR AVR C-Compiler mittels eines 
Schlüsselwortes mitzuteilen, dass beim Auftreten eines Interrupts das 
Sichern der Register auf den Stack unterbunden wird?

Beim IAR C-Compiler für den MSP430 erledigt das das __raw.


Die Interrupt Routine für den AVR (ATmega88p) sieht folgendermaßen aus:
1
#pragma vector=TIMER2_OVF_vect
2
__interrupt void IsrTimerOverflow( void )
3
{
4
  // pushen der Register verhindern
5
}

Für Hilfe wäre ich wirklich äußerst dankbar.

cb
Gast #909428
Lesenswert?

Warum soll ich Dich korrigieren, wenn Du recht hast ;-)
__C_task habe ich bislang nur bei main() benutzt. Es wäre m.E. die 
einzige Möglichkeit, ein pushen der Register zu verhindern.

Mal gefragt: was ist Dein Ziel?
OP #909437
Lesenswert?

Mein Ziel ist es, den Stack so klein wie möglich zu halten, da ich alle 
Resourcen (RAM) benötige!

Ich arbeite mit einem "festen" RAM, d.h. Alle Variablen global an einer 
festen Addresse im Speicher. Lokale Variablen landen auf dem Stack. Um 
so kleiner der Stack, desto mehr Platz hab ich für globale Variablen.

Wenn ich bei jedem Interrupt 32 Register auf den Stack sichern muss 
kostet das eben 32 Byte. Und ich bin wirklich auf jedes Byte angewiesen.

Deswegen meine Frage...
#909500
Lesenswert?

Klaus B. wrote:
> Wenn ich bei jedem Interrupt 32 Register auf den Stack sichern muss
> kostet das eben 32 Byte. Und ich bin wirklich auf jedes Byte angewiesen.

Wie kommst Du darauf, daß ein Interrupt alle Register sichert?
Hast Du schonmal ins Assemblerlistung geschaut?

Er muß nur die Register sichern, die er auch verwendet.
Es sei denn, Du rufst im Interrupt Unterfunktionen auf, aber das sollte 
man ja möglichst nicht tun.

Der IAR ist ja nicht billig, da können es sich die Entwickler nicht 
leisten unnützen Code einzubauen.


Peter
Gast #909501
Lesenswert?

Der IAR Compiler pusht nur die Register, die er unbedingt braucht und 
von denen er vorher weiß, daß er sie braucht. Daher keine Funktionen aus 
Interrupts aufrufen! Hier kennt er die Register nicht, die verwendet 
werden.
Erzeuge Dir eine .lst Datei mit Assembler-Quellcode (Option -lC). Da 
sieht man genau, was für den Stack gebraucht wird.

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