Forum: Compiler & IDEs RAM voll?


von Fabian Braun (Gast)


Lesenswert?

Hallo Allerseits

Ich bin zurzeit an einem Webserver mit ATMega128 dran. Jedoch spinnt
die Sache zurzeit grausam.
Ich habe einige Zwischenspeicher (Buffer). Das Programm verhält sich
komisch (führt nicht mehr das korrekt aus, was es sollte), seit ich
neue Buffer hinzugefügt habe. Wenn ich die Buffergrösse verkleinere
funktioniert es wieder tadellos - somit muss es an dem liegen. Der
Compiler bringt jedoch keine Fehler von wegen .Data maximum size oder
sowas.

Wie wir ja alle wissen hat der mega128 4kB Ram. Die Buffer für das
Dateisystem und den HTTP-Server benötigen insgesamt ca. 2kB. Somit wäre
erst das halbe RAM voll. Nehmen wir mal die restlichen Variablen
benötigen 1kB, was ich jedoch nicht glaube, da es nicht so viele sind,
dann hätte der Controller für den Stack noch 1kB frei, was meiner
Meinung nach genug ist.

Was habe ich übersehen? Ich habe viele Strings, die ich über RS232 oder
via HTTP ausgebe, aber die sind ja zuerst im FLASH drin und werden nur
temporär in das RAM geladen, oder etwa nicht.

Herzliche Grüsse und danke für die Hilfe schon im Voraus!

Gruss Fab

von Rufus T. Firefly (Gast)


Lesenswert?

Nachdem meine Glaskugel sich gerade mit einem Bluescreen verabschiedete,
muss ich unassistiert raten.

> Nehmen wir mal die restlichen Variablen benötigen 1kB,
> was ich jedoch nicht glaube, da es nicht so viele sind

Compiler geben Statistikinformationen (mapfile) aus, der man diese
Informationen entnehmen kann. Wissen ist da besser als Glauben.
Ungeschickt definierte statische resp. globale Variablen können
interessante Nebeneffekte haben.

> dann hätte der Controller für den Stack noch 1kB frei,
> was meiner Meinung nach genug ist.

Eine Meinung ist was schönes, ohne aber näheres über Dein Programm zu
wissen, kann man diese Aussage nicht beurteilen. Eine nette rekursive
Funktion, ungeschickte Parameterübergabe, ungeschickte automatische
Variablen und -hui- ist der Stack futsch.
Je nachdem, was für einen Compiler Du verwendest, könnte es ja sein,
daß der auch noch einen Heap verwendet - und der muss sich den Speicher
mit dem Stack teilen.

Du solltest mal einen Debugger bemühen.
Im ultraprimitivsten Falle kannst Du versuchen, einen Stacküberlauf
daran zu erkennen, daß sich der Inhalt einer nicht weiter verwendeten
Schutzvariablen ändert - um die anzulegen, musste Du aber wissen, wo
Dein Compiler Variablen etc. deponiert. Außerdem müsstest Du eine
entsprechende Funktion schreibem, die diese Variable zyklisch
überprüft.

Der Mega128 verfügt über ein JTAG-Interface; ich weiß zwar nicht, wie
man das bei AVRs verwendet, aber darüber ließe sich ein "echtes"
Debuggen durchführen, was vermutungsbasierter Fehlersuche gegenüber ein
Fortschritt sein müsste.

> Ich habe viele Strings, die ich über RS232 oder via HTTP ausgebe,
> aber die sind ja zuerst im FLASH drin und werden nur temporär
> in das RAM geladen, oder etwa nicht.

Mir erscheint das unnötig (warum Daten kopieren?), ob es aber so
geschieht, kannst nur Du selber wissen, da Du das Programm
geschrieben hast.

Du wirst aber verstehen können, daß ohne Nennung des
Entwicklungssystemes und ohne Sourcebeispiele Dir niemand den Fehler
suchen wird - und selbst wenn Du Deinen Quellcode posten würdest,
würden vermutlich nur sehr altruistische Forenteilnehmer sich den
ansehen und auf ganz grobe Offensichtlichkeiten hin durchlesen.

Naja, vielleicht hab' ich Dir ja trotzdem den einen oder anderen
Denkanstoß gegeben; viel Glück jedenfalls.

von Peter D. (peda)


Lesenswert?

"Ich habe viele Strings, die ich über RS232 oder
via HTTP ausgebe, aber die sind ja zuerst im FLASH drin und werden nur
temporär in das RAM geladen, oder etwa nicht."


Beim AVR-GCC werden die alle zu Beginn, also noch vor main() komplett
im RAM abgelegt und belegen diesen permanent.

In pgmspace.h gibt es einige Tricks, wie man das vermeiden kann.


Peter

von OldBug (Gast)


Lesenswert?


von Thorsten (Gast)


Lesenswert?

> Ich habe viele Strings, die ich über RS232 oder via HTTP ausgebe,
> aber die sind ja zuerst im FLASH drin und werden nur
> temporär in das RAM geladen, oder etwa nicht."

ICCAVR kann diese Strings im Flash ablegen, werden dann aber vor der
Ausgabe ins RAM kopiert.

von OldBug (Gast)


Lesenswert?

Das wird wohl jeder der gängigen Compiler können. Die Frage ist nur: wie
sehr muss man sich als "Anwender" darum kümmern?
Beim avr-gcc ist es scheinbar etwas aufwendiger, aber auch wesentlich
deutlicher zu erkennen!

Finde ich jedenfalls...

von Fabian Braun (Gast)


Lesenswert?

Servus allerseits!

Herzlichen Dank für die vielen Beiträge.

@Rufus T. Firefly
sorry dass ich den compiler nicht genannt habe. früher war das ja ein
reines avr-gcc forum und ich bin schon lange nicht mehr "hier
gewesen", darum der fehler.
es handelt sich um den avr-gcc compiler.

@peter dannegger
ja dann ist die sache wohl klar. habe bis jetzt eigentlich immer die
ram-variante genommen weil ich die andere (flash) noch nie ausprobiert
habe, werde es aber gleich mal versuchen.

Dann mal an die Arbeit...

Danke für eure Hilfe!

Gruss Fab

von Fabian Braun (Gast)


Lesenswert?

Ich bins nochmal...

Hab jetzt mal während dem Debuggen das RAM angeschaut und siehe da ca.
2kB werden nur von diesen blöden Strings besetzt, fragt mich nicht
wieso ich Volltrottel nicht früher drauf gekommen bin den RAM-Inhalt
beim Debuggen anzuschauen :-S

Tschuldigung für den Umtrieb!

von Rufus T. Firefly (Gast)


Lesenswert?

Naja, hat doch was gebracht ... mehrere Leute hier haben Dir hilfreiche
Hinweise gegeben, Du hast was draus gelernt und andere könnten
potentiell diesem Thread auch noch was entnehmen.

Insofern ist der "Umtrieb" ja Sinn dieses Forums (auch wenn jetzt
sicherlich wieder irgendwer ankommt und sich darüber aufregt, daß so
"Banalitäten", die ja im Handbuch beschrieben sind,
Selbstverständlichkeiten seien, nach denen zu Fragen nur die
persönliche Faulheit und Unreife zum Ausdruck brächte ... das aber
wurde anderswo schon ausführlichst diskutiert).

Viel Spaß jedenfalls mit Deinem jetzt funktionierenden Webserver.
Was macht der denn so, wie ist er aufgebaut?

von Fabian Braun (Gast)


Lesenswert?

Servus

Naja, manchmal braucht man auch für die kleinsten Banalitäten einen
"externen Input", damit mann nicht verzweifelt und wieder
weiterkommt. :-)

Der Webserver arbeitet mit dem NM7010A-TCP/IP-Modul von IINChip, hat
zudem ein MMC-Slot und eine RS232-Schnittstelle. Zurzeit kann der
MMC-Inhalt vollständig via HTTP angezeigt und abgerufen werden. Mittels
RS232 kann die Sache konfiguriert werden. In ferner Zukunft wäre es noch
schön, wenn wir einen FTP-Server realisieren können und so auch Daten
auf die MMC schreiben können.
"So bringt die ganze Sache ja garnix" - Ja stimmt, darum wäre es auch
noch von Vorteil, z.B. Sensoren, Relais, o.ä. an den Server zu hängen,
damit schlussendlich die ganze Sache einen wirklichen Sinn ergibt. Bis
jetzt dient dieses Schulprojekt ausschliesslich der Weiterbildung, ich
werde es später aber sicherlich noch weiterverarbeiten!

Gruss Fab

von Jörg Wunsch (Gast)


Lesenswert?

Statt Dir das umständliche FTP-Protokoll anzutun, implementier' doch
lieber ein simples HTML-Formular mit einer Upload-Möglichkeit einer
Datei via POST.

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.