Forum: Mikrocontroller und Digitale Elektronik String-Konstante zu gross für Flash (ATMega 168)


von Karsten D. (karstendonat)


Angehängte Dateien:

Lesenswert?

Hi,

ich hab einen WebServer in den ATMega 168 gequätscht.

Jetzt möchte ich den Rumpf der index.html im Flash ablegen.

Es sind auch schon andere Strings im Flash (LCD, UART...).

Das Problem ist, dass der ATMega nicht mehr arbeitet wenn die Konstante 
zu grß wird.

Die Grenze ist auch nicht ganz fest. Nachdem ich gerade einen SRAM 
String noch  aufs Flash beschränkt hab ist die Grenze etwas gesunken.

Dann hab ich andere Codeteile mit Flash-Strings wieder reingenommen und 
die Grenze ist gestiegen.

(der String liegt in der config.cpp bzw. tcp.cpp am Ende)

Hab sicher nur irgend nen einfachen Fehler gemacht ;-)

Und außerdem ist mir aufgefallen, das mir die size Funktion immer Gerate 
Byte-Werte ausgibt. Also wenn ich teilweise 1 Byte extra in eine 
Konstante pack ändert sich an der berechneten Größe nichts.

Ciao

Karsten
ATMega IDE 2007: www.karstendonat.de/avr

von Willi W. (williwacker)


Lesenswert?

Beim nächsten Byte wächst die Größe um 2, das nennt man dann wortweise 
Orientierung, optimiert für die Befehlsstruktur des AVR, jeder Befehl 1 
oder 2 Worte.

Aber zu Deinem Flash: Dein Speicher hat 16k, das ist für einen 
Web-Server, wenn Du auch noch Dateiheader und - ich vermute - andere 
längere Sachen ablegen willst, Code wirst Du auch haben wollen, nicht 
viel. Hast Du mal an ein Serielles EEPROM gedacht. Die sind einigermaßen 
preiswert zu haben und auch leicht via SPI anzusprechen. Dein AVR hat 
entsprechende Ports.

By the way: Du hast auch noch 512 Bytes EEPROM (512?). Könntest Du auch 
nutzen, hätte den Vorteil, dass Du das EEPROM einfach mitprogrammieren 
kannst.

Ciao
Willi

von Karsten D. (karstendonat)


Lesenswert?

Ich bin aber erst bei 8-10kB im Flash. Es kommt nur eine Index Seite 
rein. (1,5kB)

Der Rest läuft über ein Text File was live aus den Daten generiert wird.

Für den Web Server brauch ich bisher 2,5kB (ARP, Ping, IP, TCP, HTML). 
Da kommt noch ein kleinwenig dazu weil die TCP Verbindung noch nicht 
sauber ist.

Den internen EEPRom brauch ich schon für die Daten die er sammelt. Die 
passen nicht so richtig in den RAM. Zumindest nicht genug. Da die aber 
nur etwa 120 Bytes/ Tag sind, sollte das mit nem Zyklischen Puffer auch 
paar Jahre lang laufen.

Ich hab das Ganze noch etwas eingegrenzt, sobald ein CRLF im String ist 
gehts nicht. Liegt also erstmal nicht an der Länge.

Dabei ist egal ob ich z.B.
1
char HTML_Header[] PROGMEM =
2
   "HTTP/1.1 200 OK" "\x0D\x0A"
3
   "Server: WHZ Pendel (Atmel)" "\x0D\x0A"
4
    "\x0D\x0A";

oder
1
#define CRLF "\x0D\x0A" //(Standard.h oder auch direkt im .c)
2
char HTML_Header[] PROGMEM =     //(.c)
3
   "HTTP/1.1 200 OK" CRLF
4
   "Server: WHZ Pendel (Atmel)" CRLF
5
    CRLF;

schreib. Lass ich die CRLF weg gehts, nur die Browser mögen das ja dann 
gar nicht ;-)

In die hex Datei schreibt er korrekt 0D 0A rein.

Wenn er startet beginnt er mit dem LCD wo er aber nur Strings ohne CRLF 
anzeigt. Danach kommt erst der WebServer mit seinen Zeilenumbrüchen. Nur 
mit den CRLF drinne zeigt er nichtmal die Begrüßung auf dem LCD. Bei 
einem Kaltstart sieht man auch das er das LCD nicht mal resetted.

Ciao

Karsten

von nop(); (Gast)


Lesenswert?

Die Probleme kenn ich. Nachdem ich's in ASM neu geschrieben hab ging's 
alles rein.

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.