Forum: Compiler & IDEs Lebensdauer von lokalen Variablen im RAM


von Eiko (Gast)


Lesenswert?

Hallo!

Grundsätzlich lautet meine Frage: Wie lange reserviert der Compiler für 
eine lokale Variable Speicherplatz im SRAM? Eigentlich müsste doch, 
sobald die Variable ihre Gültikkeit verliert, auch der Speicherplatz vom 
Compiler wieder anderen Variablen zugewiesen werden können?
1
...
2
{
3
uint8_t a[100] = ...; //hier wird Speicherplatz für a[] reserviert
4
5
}                    // hier verliert a seine Gültigkeit, der Speicher müsste von anderen Variablen wieder nutzbar sein?
6
7
uint8_t b[100] = ...; //müsste den Speicherplatz von a nutzen können?

Der Compiler legt bei mir allerdings b (wenn a an Adresse Y steht) bei 
Y+100 an. Warum?


Hintergrundinfos:

Ich hab in einem Program für einen AVR das Problem, dass ich eine ganze 
Reihe verschiedener Kommandos über eine Schnittstelle versenden möchte. 
Jedes Kommando is mehrere Bytes lang und unterschiedlich aufgebaut.

Das Problem is nun, wie ich den AVR-GCC dazu bekomme, nicht jedes 
mögliche Kommando im SRAM zu halten.

Wenn ich das Komando normal deklariere, steht natürlich alles im SRAM:
1
void example()
2
{
3
    uint8_t cmd1[] = {Konstante1,Konstante2,Variable1,Variable2,...};
4
    uint8_t cmd2[] = {Konstante3,Konstante4,Konstante5,Variable3,...};
5
    uint8_t cmd3[] = {Konstante6,Variable4,Variable5,Variable6,...};
6
}

Mit PROGMEM deklarieren geht ja leider auch nicht, da die Kommandos 
nicht kompett konstant sind.

Meine Überlegung: Es soll immer nur das Kommando im SRAM aufgebaut 
werden, was auch gerade benötigt wird.

Ich hab das ganze dann so probiert:
1
send_comand((uint8_t[]){Konstante1,Konstante2,Variable1,Variable2,...};

was ja im Prinzip folgendem Code entspricht:
1
{
2
uint8_t cmd[] = {Konstante1,Konstante2,Variable1,Variable2,...};
3
send_command(cmd);
4
}

Das initialisieren des Array passiert nun, wie es soll nur, wenn das 
Kommando gebraucht wird. Allerdings wird weiterhin, jedem Array ein 
eingener Speicherbereich im SRAM zugewiesen. Trotz dass die Lebensdauer 
des Array nach dem Funktionsaufruf endet.

Wie könnte man das Problem noch lösen?

von Falk B. (falk)


Lesenswert?

@ Eiko (Gast)

>Grundsätzlich lautet meine Frage: Wie lange reserviert der Compiler für
>eine lokale Variable Speicherplatz im SRAM? Eigentlich müsste doch,
>sobald die Variable ihre Gültikkeit verliert, auch der Speicherplatz vom
>Compiler wieder anderen Variablen zugewiesen werden können?

Ja, die werden alle auf den Stack gepackt.

>Der Compiler legt bei mir allerdings b (wenn a an Adresse Y steht) bei
>Y+100 an. Warum?

Woher weisst du das? Aus dem List File?

>Das Problem is nun, wie ich den AVR-GCC dazu bekomme, nicht jedes
>mögliche Kommando im SRAM zu halten.

Pack jedes Kommando in eine eigene Funktion.

MfG
Falk

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Eiko wrote:

> Grundsätzlich lautet meine Frage: Wie lange reserviert der Compiler für
> eine lokale Variable Speicherplatz im SRAM? Eigentlich müsste doch,
> sobald die Variable ihre Gültikkeit verliert, auch der Speicherplatz vom
> Compiler wieder anderen Variablen zugewiesen werden können?

Kann, aber muss nicht.  GCC reserviert den Platz während der
gesamten Funktion, der Framepointer wird nur einmal manipuliert.

> Meine Überlegung: Es soll immer nur das Kommando im SRAM aufgebaut
> werden, was auch gerade benötigt wird.

> Wie könnte man das Problem noch lösen?

* malloc()
* eine union nehmen

von Karl H. (kbuchegg)


Lesenswert?

* die konstanten Teile der Kommandos ins Flash
  und zur Laufzeit in 1 Buffer das Kommando zusammenbauen.

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.