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
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.
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.
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. :-)
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
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.