Hallo. Ich schreibe zur Zeit an einem guten Stück Software für meinen ATMega128, der ja bekanntlich 4kb Ram hat. Ich brauche 3 mal einen 512-Byte-Buffer und habe noch einige globale Variablen. AVR-Studio mit ggc-Plugin sagt: Program: 42284 bytes (32.3% Full) (.text + .data + .bootloader) Data: 1943 bytes (47.4% Full) (.data + .bss + .noinit) Threoretisch müsste ich ja jetzt noch ungefähr die Hälfte des Rams frei haben. Wenn ich mir ein paar Adressen von globalen Variablen ausgeben lasse, liegen die alle so bei ~1600. Lokale Variablen z.B. ein paar 64-Byte Arrays liegen bei ~4300. Die Prozedurverschachtelung ist nicht sehr hoch, weshalb ich ausschließen kann, dass der Stack mit Rücksprungaddressen vollgemüllt ist. Aber mir stellt sich die Frage: mit was dann? Wie sieht es z.B. mit Strings aus? Werden die in den Ram geladen, wenn das Programm startet? Als weiteres ist mir aufgefallen, dass sich die Funktionalität meines Programms verbessert, wenn ich die globalen Variablen als extern deklariere. Warum? Gibt es eigentlich eine Möglichkeit lokale Variablen (und Arrays) vor dem return zu vernichten (also sofort nachdem ich die Variable nicht mehr brauche)? Oder müsste ich dann auf malloc und free zurückgreifen.... Ich vermute nämlich das dieses Vorgehen auch ein wenig helfen würde. Dann würden nicht alle kleinen Arrays noch leben, wenn ich schon in einer ganz anderen Unterprozedur gelandet bin und des Datenbereich eh nicht mehr brauche... Auf geschwindigkeits kommts bei mir nicht wirklich an. Falls sonst noch jemand Tips hat, wie man den Speicher leerer bekommt - ich bin für alles offen. MFG
Strings werden vom Flash ins RAM geladen. Also ins Flash packen (PSTR Macro, pgmspace.h). Erschwert deren Verwendung zwar ungemein, macht aber den Platz frei. Finale Lösung: externes RAM.
>>Finale Lösung: externes RAM.
Das steht leider nicht zur Verfügung...
Wie sieht es eigentlich mit der Adresse der lokalen Variable aus?
ist 4300 OK, oder nicht? Der Stack wird ja von der höchsten Adresse aus
adressiert.... ist das irgendwas auffällig?
(ich weiß, das 4300 über 4096 liegt - aber ich meine gelesen zu haben,
dass der ram noch etwas weiter geht)
MFG
Der RAM des ATmega128 beginnt bei 0x100 (= 256) und geht daher bis 0x1100 (= 4352). Damit ist 4300 eine normale auf dem Stack liegende Adresse, mithin sinnvoll für eine lokale Variable. Letzter Ausweg: Upgrade auf ATmega1281.
Also so wies aussieht, zählen die Strings mit in die Speicher-Angabe des AVRStudios mit hinein. Also ist der Ram im Bereich von 0-2Kb mit globlaen Variablen/Array belegt. Eine Ausgabe des Stackpointers (SP) erbrachte NIE kleinere Zahlen als 4000. D.h. auf dem Stack liegt maximal weniger als ein halbes KB. Wenn sich Heap und Stack nicht in die Quere kommen und sich nicht gegenseitig überschreiben: an was liegt es dann? Ich bin mir recht sicher, dass ich nicht über ArrayGrenzen hinaus schreibe. (Das war ja der Grund, warum ich vermutete, dass der Ram voll ist - die Arrays sind alle überdimmensioniert) Also: Was ist es dann?
Dreck. Ich hasse solche Leute, die von ihren eigenen Fehlern ablenken und sie auf den Compiler oder die Hardware schieben. Und nun bin ich selbst so ein unmensch. grrrr. Das Problem war, dass aufgrund von Programmierfehlern diverse Variablen sinnlosen inhalt hatten. Nunja. Da ich ziemlich viel gesucht hatte und das Problem nicht eingrenzen konnte, habe ich darauf geschworen, dass es an Speichermangel liegt. Ich habe daraufhin diverse Arrays verkleinert und weiterprobiert. Und genau diese Arrays wurden mir nun zum Verhängnis und haben mir den Stack zerschossen. Ich hab die Array jetzt wieder vergrößert - diesmal mit viel Vertrauen, da ich noch 1.5kb ram frei habe (wie ich jetzt weiß) ;) Das Problem an dem es vorher lag war auch ein unterdimmensioniertes Array. Warum - kann ich nicht sagen. Eigentlich hätte es min. 1,5mal für den Inhalt reichen sollen - Naja - jetzt reichts 2mal :) Also nicht dass das so klingt, als wäre ich der komplette Chaosprogrammierer: Die Inhalte der Arrays sind recht "dynamisch" und unterschiedlich lang - deswegen die größeren Arrays - als Puffer für Extremfall-Stabilität. MFG und sorry für die verschwendete Zeit derer, die hier geantwortet haben.
Hi was Jörg dir noch mitteilen wollte: Lokale Variablen liegen (sofern sie nicht static sind) immer auf dem Stack. Deshalb auch die hohen Adressen für deine Variablen. Matthias
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.