Web Server well structured

Causa stop neve stanotte mi sto portando avanti :) Ho lavorato intensamente al web server ed ho ottenuto, a mio parere, un buon risultato! Infiniti e profusi ringraziamenti a S.Google ed a LadyAda ovviamente :) Al momento ricevo via seriale, loggo su sd e pubblico su pagina web quasi una decina di variabili, più i file di log contenuti nella sd. Lo sketch è sui 23110 bytes e FREERAM mi da un bel 374 :) Sono convinta che si possa migliorare, quindi sto cercando di pulire ed ottimizzare il codice, vorrei cercare di fare un altro po' di spazio in ram e magari mettere su due righe per pachube.

Ho quindi iniziato a studiarmi PROGMEM, considerato che ci sono un sacco di cose che potrei metterci dentro. Ho iniziato da questo esempio: http://arduino.cc/playground/Code/WebServer Ma su IDE 22 non mi si compila nemmeno. Nel playground non vedo riferimenti all'IDE da usare od altro... quindi chiedo lumi. Oppure se avete qualche link a webserver in progmem per l'IDE 22, ben vengano, così studio. Non solo per imparare progmem ma anche per capire cosa, di un web server, ha senso mettere in progmem.

Grazie!

sketch_feb02b:21: error: variable 'HTTP_DEF readHTTPRequest' has initializer but incomplete type sketch_feb02b:21: error: 'EthernetClient' was not declared in this scope sketch_feb02b:22: error: variable or field 'sendPage' declared void sketch_feb02b:22: error: 'EthernetClient' was not declared in this scope sketch_feb02b:22: error: expected primary-expression before 'struct' sketch_feb02b:23: error: variable or field 'contentPrinter' declared void sketch_feb02b:23: error: 'EthernetClient' was not declared in this scope sketch_feb02b:23: error: expected primary-expression before 'char' sketch_feb02b:24: error: variable or field 'sendContent' declared void sketch_feb02b:24: error: 'EthernetClient' was not declared in this scope sketch_feb02b:24: error: expected primary-expression before 'int' sketch_feb02b:106: error: 'EthernetServer' does not name a type sketch_feb02b.cpp: In function 'void setup()': sketch_feb02b:110: error: 'server' was not declared in this scope sketch_feb02b.cpp: In function 'void loop()': sketch_feb02b:120: error: 'EthernetClient' was not declared in this scope sketch_feb02b:120: error: expected `;' before 'client' sketch_feb02b:121: error: 'client' was not declared in this scope sketch_feb02b:127: error: 'sendPage' was not declared in this scope sketch_feb02b:129: error: 'contentPrinter' was not declared in this scope sketch_feb02b.cpp: At global scope: sketch_feb02b:142: error: 'EthernetClient' was not declared in this scope

Ciao

tutta la parte Ethernet è stata abbastanza rivista con l'arrivo dell'IDE 1.0, gli esempi sono stati aggiornati di conseguenza. Ti consiglio di passare all'ultima versione... bye

Nel forum tedesco é stato nominato la seguente libreria per un uso piú comodo di PROGMEM: http://arduiniana.org/libraries/flash/ Ciao Uwe

uwefed: libreria per un uso piú comodo di PROGMEM: http://arduiniana.org/libraries/flash/

Fanno sempre cose fighe questi di arduiniana... Ho letto l'articolo e mi pare una cosa bella, l'ho salvato per la prima volta che mi capiterà di averne bisogno! F

Ciao,
in questo bel progettino:
http://www.jo3ri.be/arduino/arduino-projects/network-settings-web-page-form-using-eeprom-to-save-submit#TOC-Code
come in questo dello stesso utente:
http://www.jo3ri.be/arduino/arduino-projects/an-integrated-webpage-with-image
si fa largo uso di PROGMEM per salvare tutta la parte statica della pagina html che si deve generare.
Programmaticamente si vanno poi ad inserire le variabili.

Io lo ho usato con l’IDE 0022, se non sbaglio c’è da includere la libreria pgmspace per poterlo usare:

#include <avr/pgmspace.h>

Lo sketch è sui 23110 bytes e FREERAM mi da un bel 374

scusa Daniela.. cosè questo FREERAM.. io sto cercando di capire come gestire l'uso della RAM durante l'esecuizione degli sketc......

[quote author=Paolo S link=topic=89931.msg675930#msg675930 date=1328215221] scusa Daniela.. cosè questo FREERAM.. io sto cercando di capire come gestire l'uso della RAM durante l'esecuizione degli sketc...... [/quote] Il problema della RAM libera tocca molti progetti dato che l'Atmega328 ha solo 2 kB di memoria disponibile per stack e variabili. Cerca sul forum, si è parlato molto di avr-size (un tool per sapere in anticipo l'occupazione statica della memoria da parte dello stacksketch) e di una funzione da inserire nello sketch stesso per avere il quantitativo di memoria libera a runtime.

@Luca io all'ultima versione ci passerei più che volentieri :) Il problema è che gestisce la ram in modo strano... Lo sketch web server su IDE 22 mi lascia libera 0.4 k di ram, lo stesso sketch (con le opportune lib aggiornate) su IDE 1... mi lascia libera 0.1k di ram, che è un margine troppo piccolo! Sto lavorando con entrambe gli IDE in parallelo, sperando di riuscire a fare un porting che non sia castrante :\

Pitusso e Uwe, grazie, in effetti gestire la PROGMEM con FLASH è semplice, le strighe si creano e si stampano da sole :) Ho inserito tutto quello che potevo e sono arrivata a 0.5k di FREERAM tondi tondi :)

@Paolo, benvenuto anche tu nel club del "o mio dio sto finendo la ram"... l'altro giorno stavo andando in crisi ed a momenti compravo l'arduino mega per non avere più fastidi :P

FREERAM è un comando disponibile nella libreria SDFAT, nello specifico nella sottolibreria SdFatUtil.h. Esiste sia per IDE22 che per IDE1 e nasce per gestire le SD card, è un alternativa alla lib SD ufficiale. Io preferisco la SDFAT perché occupa meno in sketch. http://code.google.com/p/sdfatlib/downloads/list FREERAM lo richiami con un comando semplicissimo:

  Serial.println(FreeRam());

e ti da il consumo istantaneo della ram. Puoi piazzarlo in varie parti del codice e vedere come si comporta. Al setup, ad esempio, io ho liberi 0.6 k. dopo aver immagazzinato per la prima volta le variabili, scendo a 0.5k.

Non vorrei sbagliarmi ma credo che il comando FREERAM sia incluso nella libreria SD ufficiale distribuita con l'IDE 1.0. Mi pare di averlo visto in tyniwebserver (aggiornato all'IDE uno con SD.h) usarlo. Avr-size, come dice leo, è l'alternativa... ma io non mi sono trovata bene, crea una stima della ram basandosi sullo sketch compilato, non da una vera prospettiva purtroppo. Alcune volte anche se avr-size mi diceva che avevo 2 o 3 k liberi, l'arduino impazziva, sintomo che avevo finito la ram :\

Alcune precisazioni.

La questione della memoria libera lasciata dalle varie versioni dell'IDE penso dipenda dalle funzioni che, ad ogni avanzamento di versione, inseriscono nel core stesso dell'Arduino. Funzioni che, usate o non usate, vengono comunque compilate e "pigiate" nella memoria del micro, andando poi a consumare risorse. Nello specifico, la 1.0 ha aggiunto diverse cose in più tra cui, Daniela, anche la gestione delle stringhe in Flash integrando la funzione nell'IDE stesso. Basta infatti raggruppare una stringa tra F() per caricarla direttamente dalla Flash senza dover appesantire ulteriormente lo sketch usando librerie esterne. Cito dal changelog:

  • Support has been added for printing strings stored in flash (program memory) rather than RAM. Wrap double-quoted strings in F() to indicate that they should be stored in flash, e.g. Serial.print(F("hello world")).

Tornando alla memoria libera, se ne discusse già in passato e la questione era: 1) volete uno strumento che dia un'approssimazione della memoria consumata ma che non sia invasivo oppure 2) volete uno strumento invasivo, che consumi esso stesso memoria, ma che dia una istantanea precisa del consumo?

Io scelgo la 1) per cui uso avr-size che, come ho già detto, riporta l'occupazione statica della memoria da parte dello sketch (refuso: ho scritto stack nel precedente post). "Statica" perché se si crea un array dinamicamente in base a variabili modificate a runtime, avr-size ovviamente non potrà mai sapere quanti elementi ci verranno infilati dentro.

leo72:

  • Support has been added for printing strings stored in flash (program memory) rather than RAM. Wrap double-quoted strings in F() to indicate that they should be stored in flash, e.g. Serial.print(F("hello world")).

Interessantissimo, questa non la sapevo e devo ancora pensarci un po' su per capirla bene. L'ho appena implementata sullo sketch del web server su IDE 1.0 Effettivamente funziona e funziona senza nemmeno dover importare la libreria flash! Però... su IDE 22 (con la libreria flash) ho 500 di FREERAM, su IDE 1, senza flash sono a 375. E' un bel passo avanti dai 230 e qualcosa di ieri, però è sempre molto meno :\ Le parti messe in PROGMEM sono le stesse, quindi il consumo è altrove. Tra l'altro lo sketch su IDE 22 è DI 23k e qualcosa, su IDE 1... 28k. Le lib sono le stesse, anzi, in IDE1 non ho nemmeno la flash :\

Io ho la sensazione che tutto stia, giustamente, aumentando in termini di risorse necessarie. Come i vecchi pc che funzionavano con mezzo mega di ram ed ora se non hai 4 giga a fatica ti si accende :)

DanielaES: Io ho la sensazione che tutto stia, giustamente, aumentando in termini di risorse necessarie.

E' ciò che ti ho fatto notare anch'io. Crescono le funzioni integrate ma, ovviamente, queste funzioni qualcosa consumano per poter funzionare.

Come i vecchi pc che funzionavano con mezzo mega di ram ed ora se non hai 4 giga a fatica ti si accende :)

Questa è una cosa che odio con tutto me stesso... paghiamo in termini di risorse "orpelli" grafici che di funzionale non hanno nulla dimenticandoci un motto base dell'informatica: KISS. Keep It Simple, Stupid.

DanielaES: Io ho la sensazione che tutto stia, giustamente, aumentando in termini di risorse necessarie. Come i vecchi pc che funzionavano con mezzo mega di ram ed ora se non hai 4 giga a fatica ti si accende :)

Alcune librerie che vengono incluse automaticamente sono state aggiornate o corrette e percui cambia la grandezza del codice.

Una soluzione di RAM scarsa é usare un Arduino Mega2560. Se non ci stai con la memoria puoi aggiungerne un SRAM che viene visto come RAM interna per avere complessivamente 64kByte di RAM.

Esempio nella descrizione del SKT500 http://www.atmel.com/dyn/resources/prod_documents/DOC2491.PDF capitolo 2.5 External SRAM a pagina 12 Una schedina per l' Arduino Mega / Mega2560: http://ruggedcircuits.com/html/megaram.html Perché venga vista la RAM esterna come interna deve essere settato un bit:

http://ruggedcircuits.com/html/megaram.html: Enabling the External Memory Interface

Most of the pins used for accessing external RAM are automatically taken care of by the microcontroller. In order to enable the external memory interface, the SRE bit in the XMCRA (External Memory Control Register A) has to be set:

XMCRA = _BV(SRE); The external RAM on the MegaRAM is fast enough to support zero-wait-state operation so all other bits in the XMCRA register can be set to 0.

Ciao Uwe

uwefed: Se non ci stai con la memoria

Fortunatamente ci sto :) Splittando il codice ed amenità varie mi ritrovo con 0.4k di ram libera su IDE 1. E' un buon risultato. Tra l'altro il suggerimento di leo -la F())- è una F(igata), rende semplicissimo modificare il codice e spostare roba in progmem. Su IDE 22 avrei dovuto creare decine di stringe in flash, sicuramente avrei ottenuto prestazioni migliori sia in termini di RAM libera sia in termini di dimensioni sketch (lo sketch su IDE 1.0 continua ad essere 5k più grosso)... però cmq posso accontentarmi :) Cmq la F() sembra dare conflitti con la libreria flash, devo vedere se prendendo la nuova versione aggiornata si risolve.

Ora devo vedere se con 0.4 k di ram e 1.2k di sketch riesco a metterci pachube :P

DanielaES: lo sketch su IDE 1.0 continua ad essere 5k più grosso

EH?!? :astonished: Lo stesso sketch?

leo72:

DanielaES:
lo sketch su IDE 1.0 continua ad essere 5k più grosso

EH?!? :astonished:
Lo stesso sketch?

Yes. Sketch copincollato da ide 22 a ide 1 e lievemente modificato per la classe client della libreria ethernet. Ma modifiche di semplice sintassi.
Le librerie sono nominalmente le stesse:

#include <SoftEasyTransfer.h>
#include <SdFatUtil.h>  // define FreeRam()
#include <SdFat.h>
#include <stdlib.h>
#include <Ethernet.h>
#include <SPI.h>

Ma presumibilmente cambiano, ho infatti dovuto riscaricare tutte le librerie “aggiornate” per IDE 1.0
Cmq anche la libreria nativa SD.h è aumentata di 2 o 3 k dall’ide 022 all’ide 1.0

Esagerati.... il 328 ha 32K di flash, spero se ne ricordino :sweat_smile:

E' un lavoraccio :astonished:, ma per risparmiare qualche byte si potrebbe eliminare dalla librerie le parti di codice non utilizzate nel progetto. :~

Ciao

penso proprio che il compilatore utilizzi solo le parti di libreria necessarie…

lucadentella: Ciao

penso proprio che il compilatore utilizzi solo le parti di libreria necessarie...

Sulle librerie sì, ma il core credo proprio che lo importi in blocco. Tutte le funzioni predefinite di Arduino ho il timore che vengano inserite nel binario finale anche se non usate. Basta compilare uno sketch con solo setup() e loop() per vedere infatti che hai centinaia di byte occupate dal nulla :stuck_out_tongue_closed_eyes:

leo72: Sulle librerie sì, ma il core credo proprio che lo importi in blocco. Tutte le funzioni predefinite di Arduino ho il timore che vengano inserite nel binario finale anche se non usate. Basta compilare uno sketch con solo setup() e loop() per vedere infatti che hai centinaia di byte occupate dal nulla :stuck_out_tongue_closed_eyes:

Viva l'ottimizzazione :) Di sto passo il 328 diventerà obsoleto molto velocemente! A me ora tocca fare tutto con la 022, non per un fatto di funzioni o di librerie non portate... quanto perché riesco a compilare tutto con 4 k di avanzo!