Forum: Mikrocontroller und Digitale Elektronik SRAM zu voll?


von David (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von David (Gast)


Lesenswert?

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?

von c-ler (Gast)


Lesenswert?

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.

von Achim M. (minifloat)


Lesenswert?

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

von David (Gast)


Lesenswert?

Ok, danke.

von Karl H. (kbuchegg)


Lesenswert?

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).

von David (Gast)


Lesenswert?

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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Gescheiter isses die in den PGM_SPACE zu packen, alles andere ist 
Verschwendung bei Strings.

von Nachtaktiver (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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
Noch kein Account? Hier anmelden.