Forum: Mikrocontroller und Digitale Elektronik AVR + IAR Compiler + CSTACK + pushen der Register verhindern


von Klaus B. (nuccleon)


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

von Gast (Gast)


Lesenswert?

__C_task ist das Zauberwort.

von Klaus B. (nuccleon)


Lesenswert?

Korrigier mich wenn ich mich täusche, aber in Verbindung mit __interrupt 
ist __C_task meines Wissens nicht gültig. (Der Compiler sagt das selbe)

von Gast (Gast)


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?

von Klaus B. (nuccleon)


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

von Peter D. (peda)


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

von Gast (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.