Go Down

Topic: Ottimizzare codice html web server (Read 457 times) previous topic - next topic

DanielaES

Ma ciao :)
Ho una cosa stupidissima da fare che però non mi viene, ogni suggerimento sarà cosa gradita.

Sto ottimizzando il codice del mio web server e visto che spesso ho dei client.print ridondanti, volevo trovare il modo di archiviarli in memoria una volta sola e stamparli dove ne ho necessità.
Passiamo all'esempio pratico cosi ci capiamo meglio :)

Invio tre pagine html, ripetendo per tre volte l'invio dell'header http.
Code: [Select]

client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println();


E' uno spreco di spazio inutile, quindi pensavo alla possibilità di creare una funzione di questo tipo:
Code: [Select]
PageHttpOk();
...
void PageHttpOk() {
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println();
Serial.println(F("Debug: funzione inviata"));
}


E richiamarla nel loop ogni qual volta ci fosse necessità di stampare un header.
Mi sembrava una cosa stupidissima e banalissima... ma non funziona!
Ponendo la chiamata della funzione nel loop e la funzione fuori dal loop... l'header non viene inviato!
So che la funzione viene correttamente chiamata perché a seriale leggo il debug, tuttavia è come se il client print non funzionasse.
Anche analizzando i pacchetti inviati tramite whireshark vedo chiaramente che il response header non viene inviato. La conseguenza è ovviamente una pagina html completamente rovinata.

Idee del perché accade ciò?
Il client non si inizializza correttamente se richiamato da una funzione esterna?
Suggerimenti per ovviare a ciò?

Con la libreria flash potrei creare una stringa
Code: [Select]
FLASH_STRING(PageHttpOk, " blablabla l'header ecc");
e fare un client print dove voglio tutte le volte che voglio.
Code: [Select]
PageHttpOk.print(client);
Ho già provato e funziona, tuttavia includere la libreria flash occupa più spazio di quanto ne vado a liberare ottimizzando il codice :)

lesto

molto strano, quello che mi viene in mente è un'ottimizzazione aggressiva che elimina la funzione e la sua chiamata credendola inutile.

sarebbe carino capire cosa fa quella funzione F, per risolvere prova a mettere un valore di ritorno che viene utilizzato dal chiamante, e deve essere modificato anche dal chiamato (magari fai un check sullo stato di client, anche qullo è un possibile problema)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

DanielaES

Lesto scusa ma non ho capito :/
Che prova vuoi che faccia?
Per il client, tutti gli altri client.print all'interno del loop vengono inviati senza problemi.
Il client.connected and avaiable funzionano regolarlmente.
Tanto è vero che la pagina HTML viene inviata, senonché mancando l'header appare completamente senza formattazione.
L'unica parte di codice che non viene eseguita sono i client print fuori dal loop richiamati da una funzione.


PaoloP


sarebbe carino capire cosa fa quella funzione F

E' stata introdotta con l'IDE 1.0
--> http://arduino.cc/playground/Main/Printf --> Using Flash Memory for string storage
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

lesto


Lesto scusa ma non ho capito :/
Che prova vuoi che faccia?
Per il client, tutti gli altri client.print all'interno del loop vengono inviati senza problemi.
Il client.connected and avaiable funzionano regolarlmente.
Tanto è vero che la pagina HTML viene inviata, senonché mancando l'header appare completamente senza formattazione.
L'unica parte di codice che non viene eseguita sono i client print fuori dal loop richiamati da una funzione.



sono confuso anche io dal tipo di errore che hai. Prima di tutto farei una prova evitando di usare la F, si sa mai che abbia qualche bug infido & balordo.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up