Forum: Compiler & IDEs RAM-Größe und lokale Variablen


von Owen S. (senmeis)


Lesenswert?

Servus,

man vermutet, dass die kompilierte RAM-Größe in AVR Studio (AVRGCC) 
lokalen Variablen nicht enthält. Ich habe ein Programm, das 98% des RAM 
konsumiert. Dieses arbeitet nicht völlig korrekt nach der Programmierung 
obwohl die Kompilierung in Ordnung ist. Hat jemand gleiche Erfahrungen?

MfG
Senmeis

von (prx) A. K. (prx)


Lesenswert?

Owen Senmeis schrieb:

> man vermutet, dass die kompilierte RAM-Größe in AVR Studio (AVRGCC)
> lokalen Variablen nicht enthält.

Man hat recht. Die sind in Registern oder auf dem Stack, nicht statisch 
alloziert - es sei den man schreibt es extra hin. Das wird nicht 
erfasst. Bei Controllern sollte man da normalerweise keine grossen 
Klötze reinlegen.

von Hc Z. (mizch)


Lesenswert?

Wieviel Ram die lokalen Variablen belegen, kann nicht im Voraus 
kalkuliert werden, da dies völlig von der Aufruffolge und 
-verschachtelung abhängt.

Wenn aber der Anteil der Data Section groß ist (nachträglich z.B. mit 
avr-size überprüfbar), kannst Du - wenn das Programm nicht bereits 
passend geschrieben ist - davon ausgehen, dass das Verlagern von Strings 
ins Flash eine Menge davon einsparen kann.

von Karl H. (kbuchegg)


Lesenswert?

Und er sollte auch noch bedenken, dass zur Laufzeit ein wenig Speicher 
immer für den Stack benötigt werden wird, auf dem zb Rücksprungadressen 
für Funktionen abgelegt werden.
Es ist daher nicht besonders wohlüberlegt, den SRAM schon im statischen 
Fall, nach dem compilieren, auf mehr als 90 bis 95% anwachsen zu lassen. 
Er muss ja auch noch einen zunächst unbekannten Anteil an SRAM-Verbrauch 
einkalkulieren, der erst zur Laufzeit des Programms entstehen wird.

Von daher empfehlen wir (pluralis majestatis) ihm, er möge noch einmal 
sein Programm auf mögliche Speichereinsparungen durchgehen. Sollte er 
nichts finden, so kann er gerne sein Programm als Attachment hier 
einreichen, wir werden ihm gerne beratend zur Seite stehen und versuchen 
einige Bytes freizuspielen, auf das sein Programm wieder korrekt 
arbeiten möge.

:-)

von Owen S. (senmeis)


Lesenswert?

vielen Dank.

Soweit ich verstehe ist das RAM auf drei Teilen verteilt.

1: Globale Variablen
2: Lokale Variablen falls Funktionen aufgerufen werden
3: Für den Stack

Ist das korrekt?

Ich möchte auch gerne wissen, ob es möglich ist, den RAM-Verbrauch 
vorher genau zu wissen. In meinem Fall ist das Kompilieren doch richtig, 
aber laufen kann das nicht.

MfG
Senmeis

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Owen Senmeis schrieb:
> Ich möchte auch gerne wissen, ob es möglich ist, den RAM-Verbrauch
> vorher genau zu wissen.
Klar schreib alles hintereinander in die Main(aka Spagetti-Code), nutze 
nur globale Variablen und deaktiviere die Interupts...

von Karl H. (kbuchegg)


Lesenswert?

Owen Senmeis schrieb:

> Ich möchte auch gerne wissen, ob es möglich ist, den RAM-Verbrauch
> vorher genau zu wissen.

Nein.
Der exakte Verbrauch hängt von den Funktionen und deren 
Aufrufreihenfolge ab. Die wiederrum hängt des öfteren davon ab, welche 
Inputs (UART, Pinauswertung, I2C, was auch immer) dein Programm in 
welchen Funktionen exakt wie zu verarbeiten hat. Den exakten Input und 
seine zeitliche Entwicklung kennt man aber im voraus in den seltensten 
Fällen.

Nochmal das Angebot:
Poste dein Programm und wir werden sehen ob man da noch SRAM freispielen 
kann.

von (prx) A. K. (prx)


Lesenswert?

Owen Senmeis schrieb:

> Ist das korrekt?

Nicht ganz. Lokale Variablen können auf dem Stack liegen.

> Ich möchte auch gerne wissen, ob es möglich ist, den RAM-Verbrauch
> vorher genau zu wissen.

Nein, da avr-gcc keine definitive Stack-Analyse durchführt. Manche 
µC-Compiler führen eine vollständige Aufrufanalyse durch. Insbesondere 
jene die lokale Daten statisch allozieren tun dies, um ebendiese Daten 
verschiedener nicht in Konflikt stehender Funktion überlagern zu können. 
GCC ist nicht für solche Maschinen konzipiert, folglich tut er das 
nicht.

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.