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
Ich habe hier im Forum diesen Beitrag gefunden ,Titel: C++/Arduino Objektspeicher freigeben Also Speicher reservieren, Speicher nutzen, Speicher freigeben.
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 ^^
Dynamisches Speichermanagement. Braucht aber seinerseits auch Speicher (Heapverwaltung).
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...
Ingo schrieb: > Aber > vermutlich ist das wirklich nicht vorgesehen im GCC oder irgend einem > C-Compiler... Geh schlafen Ingo!
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
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!
Michael schrieb: > Diese beiden Strukturen kannst du per Pointer übereinander legen, oder > sogar ein union bilden und, und ... Das geht auch in Bascom.
Unterprogramm und calloc ist dein Freund. MfG
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.