mikrocontroller.net

Forum: Compiler & IDEs Lebensdauer von lokalen Variablen im RAM


Autor: Eiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
...
{
uint8_t a[100] = ...; //hier wird Speicherplatz für a[] reserviert

}                    // hier verliert a seine Gültigkeit, der Speicher müsste von anderen Variablen wieder nutzbar sein?

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:
void example()
{
    uint8_t cmd1[] = {Konstante1,Konstante2,Variable1,Variable2,...};
    uint8_t cmd2[] = {Konstante3,Konstante4,Konstante5,Variable3,...};
    uint8_t cmd3[] = {Konstante6,Variable4,Variable5,Variable6,...};
}

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:
send_comand((uint8_t[]){Konstante1,Konstante2,Variable1,Variable2,...};

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

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?

Autor: Falk Brunner (falk)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.