www.mikrocontroller.net

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


Autor: Klaus B. (nuccleon)
Datum:

Bewertung
0 lesenswert
nicht 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:
#pragma vector=TIMER2_OVF_vect
__interrupt void IsrTimerOverflow( void )
{
  // pushen der Register verhindern
}

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

cb

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
__C_task ist das Zauberwort.

Autor: Klaus B. (nuccleon)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus B. (nuccleon)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.