RAM-Größe und lokale Variablen

OP #1759856
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
#1759885
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.
#1759919
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.

:-)
OP #1764753
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
#1764774
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.
#1764782
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren