Forum: Compiler & IDEs Probleme mit dem Speichermanagement beim AVR mit GCC


von Ingo (Gast)


Lesenswert?

Hallo zusammen,

vielleicht könnt ihr mir hier gerade einen Moment helfen. Ich möchte auf 
einem AVR einen relativ komplexen code implementieren, welcher zur 
Initialisierung sehr viel RAM benötigt. Gleich vorab: Das Ergebnis der 
Initialisierung vor berechnen und im Programmcode ablegen geht nicht, da 
Umweltfaktoren mit einberechnet werden.
So, nun möchte ich also die Initialisierung laufen lassen und müsste 
dabei fast den ganzen Speicher (ca. 800B von den 1kB meines ATmega88) 
einnehmen. Nach der Initialisierung kann ich den Speicher dann wieder 
frei geben.
Nun mache ich mir nur recht erfolglos Gedanken wie ich das anstellen 
könnte. Der Compiler wird das mega-Array wohl kaum über die anderen 
Daten (die er da ja noch gar nicht bräuchte) drüber legen.

Kurz um:
Das einmal benötigte mega-Array wird mir vermutlich das gesamte 
Speichermanagement des Compilers zerstören und das Programm wird nicht 
laufen weil der Stack dann normale Variablen überschriebt oder gar nicht 
alle Variablen untergebracht werden können...

Kennt jemand ein Workaround für mein Problem?
mir fällt partout nichts ein.
Vielen Dank.
Ingo

von Lutz H. (luhe)


Lesenswert?

Ich habe hier im Forum diesen Beitrag gefunden ,Titel:
C++/Arduino Objektspeicher freigeben

Also Speicher reservieren, Speicher nutzen, Speicher freigeben.

von luckystrike (Gast)


Lesenswert?

nur hast du mit dieser "dynamischen" speicher verwaltung wieder einen 
overhead! und wenn schon 800b verbraten sind wirds knapp ...
hast du eventuell konstanten die als flash geschrieben werden könnten? 
oder das ergebnis aufgesplittet?
ohne code kann ich keine vorschläge für optimierung geben ^^

von manny (Gast)


Lesenswert?

Dynamisches Speichermanagement. Braucht aber seinerseits auch Speicher 
(Heapverwaltung).

von Ingo (Gast)


Lesenswert?

Es geht nicht um Optimierungen, es geht darum während der 
Initialisierung temporär ungenutzten Speicher nutzen zu können. Aber 
vermutlich ist das wirklich nicht vorgesehen im GCC oder irgend einem 
C-Compiler...

von Rababer (Gast)


Lesenswert?

Ingo schrieb:
> Aber
> vermutlich ist das wirklich nicht vorgesehen im GCC oder irgend einem
> C-Compiler...

Geh schlafen Ingo!

von Karl H. (kbuchegg)


Lesenswert?

Und, wo liegt das Problem?

Dein Initialisierungscode kommt in eine Funktion und alle Variablen die 
du nicht auf Dauer brauchst, sind lokale Variablen in dieser Funktion.

Wird die Funktion aufgerufen, werden diese Variablen 'geboren'. Ist die 
Funktion beendet, verschwinden sie wieder.

Problem gelöst.
Ein wenig musst du darauf achten, dass du in Summe den Speicher nicht 
überläufst, weil diese lokalen Variablen nicht in der Speicherstatistik 
auftauchen. Ist aber machbar.

: Bearbeitet durch User
von Michael (Gast)


Lesenswert?

Hallo,

Ingo schrieb:
> Es geht nicht um Optimierungen ...

vorgesehen ist das vielleicht nicht direkt, aber in C geht auch viel 
Missbräuchliches!

Stell die vor du definierst dir 2 Strukturen, eine für die 
Initialisierung und die andere für den normalen Programmablauf.

Diese beiden Strukturen kannst du per Pointer übereinander legen, oder 
sogar ein union bilden und, und ...
es gibt keine Grenzen!

von manny (Gast)


Lesenswert?

Michael schrieb:
> Diese beiden Strukturen kannst du per Pointer übereinander legen, oder
> sogar ein union bilden und, und ...

Das geht auch in Bascom.

von marixstorm (Gast)


Lesenswert?

Unterprogramm und calloc ist dein Freund.

MfG

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das Programm verwendet also folgende Speicherbereiche:

(S) Stack im normalen Programm.

(G) Globale Variablen im normalen Programm

(I) Platz, der während der Initialisierung benötigt wird

Wenn ich recht verstehe, ist das Problem, daß

S+G+I > RAM ist, jedoch S und G einerseits und I andererseits nicht 
gleichzeitig verwendet werden.

Ein Problem ergibt sich dann, wenn bereits I+G > RAM ist, denn dann 
funktioniert weder eine Initialisierung mit malloc noch der Verwendung 
lokalen Speichers für I, denn dieser würde die bereits Initialisierten G 
überschreiben — es sei denn, I wird vor der Initialisierung von G 
ausgeführt.

Die Frage ist auch, wofür I verwendet wird: Offenbar muß es einen Effekt 
auf G haben oder sonst einen Effekt wie SFR-Initialisierung.

Frage:  Wofür wird I benötigt, wenn es im Hauptprogramm dann nicht mehr 
verwendet wird?

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.