mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC: Lokale Var. auf Stack erzwingen


Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Frage zu lokalen Variablen in Funktionen. Ich habe 
gesehen, dass der GCC sie in Register packt, wenn es paßt. Ist ja auch 
gut so. Nur wenn die Routine rekursiv aufgerufen wird, dann ist das 
schlecht. Ich habe schon versucht, die Info zu finden, es ist mir aber 
nicht gelungen.

Wie kann ich erzwingen, dass die lokalen Variablen auf den Stack gelegt 
werden für solch einen Fall?

Ist wahrscheinlich ganz einfach (wenn man es weiß :-)).

Danke für die Info.

900ss

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
900ss D. wrote:

> Nur wenn die Routine rekursiv aufgerufen wird, dann ist das
> schlecht.

Sicher? Meist ist es besser wenn keine Daten auf dem Stack landen, weil 
dann kein vollständiger Stackframe angelegt werden muss. Denn der dafür 
nötige Update vom Stackpointer ist bei AVRs etwas aufwendig.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn jeder rekursiver Aufruf aber seine eigenen Daten benötigt? Wie soll 
das auseinander gehalten werden? Dafür ist es schlecht meine ich. Ist 
mir schon klar, dass das aufwendiger ist. Aber ich weiß keine andere 
Lösung.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich werden die Register am Anfang der Funktion auf dem Stack 
gesichert und am Ende wiederhergestellt. Bei einer rekursiven Funktion 
landen die Daten also quasi sowieso auf dem Stack, so allerdings per 
push und pop und nicht per Stackframe.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
900ss D. wrote:
> ich habe eine Frage zu lokalen Variablen in Funktionen. Ich habe
> gesehen, dass der GCC sie in Register packt, wenn es paßt. Ist ja auch
> gut so. Nur wenn die Routine rekursiv aufgerufen wird, dann ist das
> schlecht.

Warum soll das schlecht sein?

Laß das mal den Compiler machen, der weiß schon, was er tut.
C-Funktionen sind per default reentrant, wenn sie auf keine 
IO-Ressourcen zugreifen.
Es gibt Register, die muß der Aufrufer sichern und andere, die muß der 
Aufgerufene sichern.

Vielleicht kann der GCC sogar Rekursionen zu Schleifen optimieren.
Rekursionen sind ja nur kompliziert geschriebene Schleifen.


Peter

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmmm.... ich glaube ich muß da nochmal rüber nachdenken. Habe 
wahrscheinlich einen Gedankenfehler gemacht. Danke erstmal soweit.

PS. Ist wohl noch zu früh für einen Montag Morgen.... gähn ;-)

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.