Hallo, Ich habe nachdem compilieren eines Programmes (LCD Display mit lcd_strings als Ausgabe) nach dem Compilieren 99% voll .data+.bss,+noint, also SRAM. Wenn ich das Programm starte, spielt es nach kurzer Zeit <1s verrückt. Display zeigt wirres Zeug bzw. schon das was es soll, aber nicht vollständig und nicht in der Zeile, wo es soll, das Programm selbst tut auch nicht, was es soll (vorwiegend Interrupt gesteuert). Kann es sein, das der Stack dadurch überläuft und der AVR sich aufhängt? Oder kann man beim Compilieren den SRAM wirklich 100% ausnutzen? Merci. David
David schrieb: > Kann es sein, das der Stack dadurch überläuft ja, sogar sehr wahrscheinlich > und der AVR sich aufhängt? nein, der AVR hat überhaupt keinen Grund sich bei soetwas aufzuhängen. Er macht nur nicht das was du erwartest, für ihn selber ist noch alles ok. > Oder kann man beim Compilieren den SRAM wirklich 100% ausnutzen? nein kann man nicht.
Ok, dann habe ich wohl die Ursache gefunden. Ich wurde schon verrückt, bin stundenlang das Programm durchgegangen. Gibt es irgendwo eine Grenze, wo man sagt, hierüber darf man nicht (% Auslastung). Vermutlich nicht, weil es ja programmabhänging sein wird, wie verschachtelt dieses ist. Aber so eine Sicherheitsgrenze aus dem Bauch/Erfahrung?
Was dir beim Kompilieren an SRAM Verbrauch angezeigt wird ist nur der Teil des SRAMs, der SICHER belegt ist. Also zum Beispiel globale oder statische Variablen. Alles, was später malauf dem Stack landet, gehört da nicht dazu. Aber nicht nur lokale Variablen, die nur innerhalb ihrer Funktion existieren liegen auf dem Stack. Jeder Funktionsaufruf kostet dich Stackspeicher für die übergebenen Argumente, die Rücksprungaddresse und evtl. noch für den Rückgabewert. Wenn du Funktionen rekursiv aufrufst kann sich der Stackverbrauch enorm Aufschaukeln. Wann du lieber aufhören solltest, statischen Speicher zu verbrauchen kann man also Pauschal nicht sagen. Kommt immer drauf an wie intensiv du deine Funktionen ineinander verschachtelst.
David schrieb: > hierüber darf man nicht (% > Auslastung). Wie weit ist der SRAM durch static- und global-Variablen schon ausgelastet? Dazu kommt die maximale Verschachtelungstiefe deiner Funktionen(welche Register müssen nach dem call gerettet werden). Manchmal brauchen Funktionen auch selbst noch RAM, z.B. wenn du innerhalb einer Funktion ein uint8_t-Array mit einer Zahl am Members größer als die gerade freien Register definierst. Man kann das also pauschal nicht sagen. Schau dazu am besten das generierte Assemblerlisting nach STS usw durch. Konstante Strings wie Namen von Menüpunkten o.Ä. speichert man am besten mit PROGMEM in den Flash. Dann werden die Strings nicht erst in den RAM kopiert und von da aus auf dem LCD ausgegeben. mfg mf
Wenn du dein Programm mal herzeigst, können wir dir helfen es durchzusehen, wo man einfach und mit wenig Aufwand ein wenig SRAM freischaufeln könnte (sofern es überhaupt möglich ist).
Danke für das Angebot. Ich versuche mal die LCD_strings in den SRAM auszulagern und dann versuche ich es nochmal. Sollte es nicht klappen, melde ich mich.
Gescheiter isses die in den PGM_SPACE zu packen, alles andere ist Verschwendung bei Strings.
David schrieb: > Danke für das Angebot. Ich versuche mal die LCD_strings in den SRAM > auszulagern und dann versuche ich es nochmal. Sollte es nicht klappen, > melde ich mich. Du meinst in den Flash - Im SRAM sind die bereit. Ich kann dir das Tutorial zu den einzelnen Speicherarten hier im µc.net sehr gut empfehlen! http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29
Nachtaktiver schrieb: > David schrieb: >> Danke für das Angebot. Ich versuche mal die LCD_strings in den SRAM >> auszulagern und dann versuche ich es nochmal. Sollte es nicht klappen, >> melde ich mich. > > Du meinst in den Flash - Im SRAM sind die bereit. Nitpicking: ... und im Flash auch. (wie kämen sie sonst beim Hochfahren ins SRAM) D.h. das ist eigentlich gar kein Auslagern, sondern das Verhindern einer unnützen Kopie, die nur SRAM belegt und sonst zu nichts gut ist (solange die Strings nicht verändert werden müssen)
Wenn du die ganzen Strings in SRAM laden lässt, isses ja kein Wunder, dass er sich verschluckt. Hier ne Anleitung wie die im Flash bleiben: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003&start=all&postdays=0&postorder=asc
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.