www.mikrocontroller.net

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


Autor: Owen Senmeis (senmeis)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

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

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

:-)

Autor: Owen Senmeis (senmeis)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

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

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

Autor: A. K. (prx)
Datum:

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

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.