Forum: Mikrocontroller und Digitale Elektronik Speicherplatzreduzierung Atmega 1284p Webpage


von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Hallo
Ich habe einen A1284p auf dem NetIo im Betrieb. Ich bastele mir dazu 
gerade eine "Webpage", dabei ist mir aufgefallen, dass diese unglaublich 
Speicher frisst.
Die folgende Website (s.Anhang) benötigt 9,6% des Speichers des Atmega 
1284p, wo könnte ich dort, wie Speicherplatz einsparen? Habt Ihr da ein 
paar Tipps für mich? Danke!

Edit: Gibt es eigentlich einen pinkompatiblen MC der mehr Speicher als 
den A1284p hat?!?!

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also eine gewisse Menge kannst du schon sparen, wenn alle überflüssigen 
Zeilenumbrüche und Tabs und Leerzeichen aus dem HTML verschwinden. Dazu 
gibts auch kostenlose Tools im Netz die das automatisch erledigen.
Wenn du auf die Art eine "größere" Website bauen willst wirst du um 
zusätzlichen externen Speicher nicht herumkommen.
Da gibts zwei Möglichkeiten:
1) SD-Karte
 + einfach am PC mit Daten zu befüllen
 - Aufwendiger bei der Software am µC
2) SPI-Flash
 + einfaches Auslesen der daten mit dem µC
 - zusätzliche Software nötig um die Daten vom PC über den µC
   in den Flash zu bekommen

Sascha

von Julian R. (tuefftler)


Lesenswert?

Wenn ich mir das ansehe, dann könntest du versuchen, die ganzen 
Tabulatoren oder Leerzeichen bei den option-Tags rauszuwerfen und auch 
keine Zeilenumbrüche im Text zu haben. Wenn nötig kannst du die ja mit 
<br /> machen!

von Sascha W. (sascha-w)


Lesenswert?


von Daniel H. (Firma: keine) (commander)


Lesenswert?

Hallo,

HTTP unterstützt GZIP-Kompression, ggf. könntest du versuchen die Seite 
komprimiert an den Browser auszuliefern, Voraussetzung ist natürlich, 
dass der Browser das unterstützt, wovon man bei modernen Browsern aber 
ausgehen kann.

> https://en.wikipedia.org/wiki/HTTP_compression

Edit: Habs gerade mal mit 7-ZIP als GZIP gepackt. Unkomprimiert ist die 
Datei knapp 17,6 KB groß, mit Komprimierung nur noch etwa 1,97KB.

Edit 2: Mit "komprimiert ausliefern" meine ich natürlich, dass die Seite 
bereits komprimiert hinterlegt ist und nicht erst zur Laufzeit 
komprimiert wird, das würde ja keinen Sinn machen.

Viele Grüße
Daniel

: Bearbeitet durch User
von Reiner O. (elux)


Lesenswert?

Naja, und wenn ich mir die ganzen
1
 <option value=\"0000\">Aus %</option>"
 usw.
ansehe, würde ich die (da gleich) genau einmal definieren und dann als 
Variablen zur Auslieferung einbauen...

Gruss aus Berlin

Elux

von Markus P. (sebastianwurst)


Lesenswert?

Daniel H. schrieb:
> HTTP unterstützt GZIP-Kompression, ggf. könntest du versuchen die Seite
> komprimiert an den Browser auszuliefern, Voraussetzung ist natürlich,
> dass der Browser das unterstützt, wovon man bei modernen Browsern aber
> ausgehen kann.

Danke ersteinmal an Alle vorab!

@Daniel, die html Seite läuft ja im Flash des MC. Wie funktioniert das 
mit zippen?!? Die html Seite ist ja eingebettet in C (webpage.h)?


Das mit dem komprimieren habe ich gerade einmal ausprobiert, das Problem 
was ich hier sehe ist das die Datei ja keine reine .html Datei ist 
sonder eine in C eingebettete. Somit kompimiert er auch wichtige 
Einträge weg (Wie z.B. das " vor "<head>\r\n"
???

 @Rainer, kenne mich mit html nur mäßig aus, wie meinst du das genau?

Vielen Dank!

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Markus P. schrieb:
> Daniel H. schrieb:
>> HTTP unterstützt GZIP-Kompression, ggf. könntest du versuchen die Seite
>> komprimiert an den Browser auszuliefern, Voraussetzung ist natürlich,
>> dass der Browser das unterstützt, wovon man bei modernen Browsern aber
>> ausgehen kann.
>
> Danke ersteinmal an Alle vorab!
>
> @Daniel, die html Seite läuft ja im Flash des MC. Wie funktioniert das
> mit zippen?!? Die html Seite ist ja eingebettet in C (webpage.h)?
Anstelle der Textdaten kommen einfach die Binärdaten in das C-Array, 
allerdings must du der Gegensite im HTTP-Header der als Antwort auf den 
Request gesendet wird mitteilen das die Daten gzip komprimiert kommen.

Da du in deine Website vermutlich auch Live-Werte aus dem µC einbettest, 
kannst du die Komprimierung auch gleich wieder vergessen, denn in den 
komprimierten Daten lässt sich zu Laufzeit natürlich nichts mehr ändern!

Sasch

von Ungläubiger (Gast)


Lesenswert?

Markus P. schrieb:
> Edit: Gibt es eigentlich einen pinkompatiblen MC der mehr Speicher als
> den A1284p hat?!?!

Das sollte der größte sein, den es gibt

Nutz du denn auch den EEProm vollständig (da ist noch eine kleine 
Reserve) und dann einfach den HTML-Code gnadenlos komprimieren

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Hallo,

wie Sascha schon schrieb hinterlegst du in deinem Buffer nur noch die 
komprimierten Binärdaten.

Allerdings ist der Einwand von Sascha natürlich korrekt, wenn du zur 
Laufzeit controllerseitig Parameter auf der HTML-Seite anpassen möchtest 
bringt dir die Kompression nichts.

Der Atmega1284P ist so in der Form der größte, es gäbe zwar noch 
Atmega256x, diese haben jedoch ein anderes Gehäuse.

von Ungläubiger (Gast)


Lesenswert?

>"<table class=\"tbl\"

du weißt jedem table Element die gleiche Klasse zu -> 
Klassendefinition löschen und die styles direkt an table knüpfen

> "<div id=\"content\">" sieht man auch häufig, selbe wie oben, nur den Header 
lassen, der überschreibt einfach alles, was nicht passt

und natürlich die Tipps der vorposter

von Markus (Gast)


Lesenswert?

Hallo,

also... Leerzeichen und das mit der Klasse verstehe ich jetz so, oder?

vorher:
1
"<table class=\"tbl\" border=\"0\">"
2
3
  "<td>"
4
      "<form id=\"form1\" name=\"f1\" method=\"post\" action=\"\">"
5
      "  <select name=\"INVA08\" class=\"Dropdown\"  onchange= document.getElementById(\"form1\").submit()>"//size=\"3\"
6
      "      <option selected >Halogen Wohnzi.: %VA@08% </option>"
7
      "      <option value=\"0000\">Aus %</option>"
8
      "      <option value=\"0005\"> 5 %</option>"


nachher:
1
"<table><td>"
2
"<form id=\"form1\" name=\"f1\" method=\"post\" action=\"\">"
3
"<select name=\"INVA08\" class=\"Dropdown\"onchange=document.getElementById(\"form1\").submit()>"//size=\"3\"
4
"<option selected >Halogen Wohnzi.: %VA@08% </option>"
5
"<option value=\"0000\">Aus %</option>"
6
"<option value=\"0005\"> 5 %</option>"

Wie könnte ich dieses:

"<option value=\"0000\">Aus %</option>"

noch mit einer Variablen optimieren, so wie es Reiner O. geschrieben 
hat?

Sorry, aber html ist nicht so mein Ding....

Danke!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Markus schrieb:
> Sorry, aber html ist nicht so mein Ding....

Dann gibt es drei Möglichkeiten:
- Sich damit beschäftigen
- Jemanden Bezahlen der es für dich tut
- Es sein lassen...

Markus schrieb:
> Wie könnte ich dieses

Stichwort Schleife... das bringt aber eh alles nur ein paar Bytes, hast 
du den nun akut Platzptobleme? Dann wäre eventuell ein externer Speicher 
(EEPROM) zielführender.

von greg (Gast)


Lesenswert?

Besorg oder schreib dir mal ein Programm, das aus einer Datei ein Stück 
C-Code macht. Dann kannst du das HTML ganz normal schreiben und musst 
dir keine C-Konstanten zusammenfummeln. Auch gzip-Kompression ist dann 
easy.

von Stefanus (Gast)


Lesenswert?

Mein AVR Webserver 
(http://stefanfrings.de/avr_io/NET-IO-Modul_v2.11.11.zip) enthält ein 
Perl Script, welches ein ganzes Verzeichnis voller Dateien (nicht nur 
HTML) in C-Arrays (incl. Inhaltsverzeichnis) übersetzt. Diese Arrays 
binde ich dann mittel #include in meinen Webserver ein.

Allerdings löst das dein Platzproblem nicht. Dagegen würde ich Dir 
empfehlen, eine SD Karte zu benutzen und die 
http://www.mikrocontroller.net/articles/AVR_FAT32 Library zu nutzen. Du 
kannst damit die Dateien wahlweise Byteweise oder in 512-Byte Blöcken 
einlesen.

von Davis (Gast)


Lesenswert?

Bewertung
007   ▲ lesenswert
▼ nicht lesenswert

> Mein AVR Webserver
> (http://stefanfrings.de/avr_io/NET-IO-Modul_v2.11.11.zip) enthält ein
> Perl Script, welches ein ganzes Verzeichnis voller Dateien (nicht nur
> HTML) in C-Arrays (incl. Inhaltsverzeichnis) übersetzt. Diese Arrays
> binde ich dann mittel #include in meinen Webserver ein.

Neue Baustelle: Pearl.

> Allerdings löst das dein Platzproblem nicht. Dagegen würde ich Dir
> empfehlen, eine SD Karte zu benutzen ...

Sehe ich auch so. Zum NETIO gibt es eine Zusatzplatine u. a. mit SD-Card 
Halter. Kompression ist aber trotzdem Pflicht, da die Übertragungszeiten 
auch eine Rolle spielen (können). Wenn du den Webserver von Radig bzw. 
ein Derivat hast, ist die SD-Card Unterstützung bereits enthalten.

von Stefanus (Gast)


Lesenswert?

> Neue Baustelle: Pearl.

Irgendeinen Script-Interpreter oder Compiler wird man dazu schon 
brauchen. Ich habe Perl verwendet, weil das in allen Linux/Unix System 
vorinstalliert ist und für Windows konnte ich einfach die perl.exe ins 
Projektverzeichnis legen. So funktioniert das Plattformunabhängig.

Mit Boardmitteln (WinAVR, oder Atmel Toolchain) geht es nicht - hab ich 
lange genug probiert. Wenn in der Tollchain eine neuere Bash Version 
version drin wäre, würde es mit bash gehen.

von Stefanus (Gast)


Lesenswert?

> Kompression ist aber trotzdem Pflicht, da die
> Übertragungszeiten auch eine Rolle spielen

Bei meinem Webserver ist die SD Karte viel viel viel schneller, als die 
Ethernet Schnittstelle. Die meiste Rechenzeit geht für die Prüfsummen im 
IP Protokoll drauf, nicht für den Datentransfer.

von Kaj (Gast)


Lesenswert?

Markus P. schrieb:
> Die folgende Website (s.Anhang) benötigt 9,6% des Speichers des Atmega
> 1284p, wo könnte ich dort, wie Speicherplatz einsparen?
Weniger reinschreiben in die Datei... Es ist eine Textdatei, und die ist 
nunmal so gross, wie die Anzahl der Zeichen die drin stehen...

von basti (Gast)


Lesenswert?

Stefanus schrieb:
>> Kompression ist aber trotzdem Pflicht, da die
>> Übertragungszeiten auch eine Rolle spielen
>
> Bei meinem Webserver ist die SD Karte viel viel viel schneller, als die
> Ethernet Schnittstelle. Die meiste Rechenzeit geht für die Prüfsummen im
> IP Protokoll drauf, nicht für den Datentransfer.

Das mag ja soweit stimmen, allerdings stimmt seine Aussage doch 
trotzdem. Je besser die Daten auf der SD-Karte komprimiert sind, desto 
weniger Daten müssen letztlich auch über die Netzwerkschnittstelle 
übertragen werde, ergo desto weniger Rechenzeit fällt für die Übertragen 
der Daten und die Erzeugung von Prüfsummen an.

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.