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
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.
"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
> 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.
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...
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
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!
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.