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


von 900ss (900ss)


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

von Andreas K. (a-k)


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.

von 900ss (900ss)


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.

von Stefan E. (sternst)


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.

von Peter D. (peda)


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

von 900ss (900ss)


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 ;-)

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.