mikrocontroller.net

Forum: Compiler & IDEs RAM voll?


Autor: Fabian Braun (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Fabian Braun (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fabian Braun (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Fabian Braun (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.