Ma l'hai fatto un controllo statico del consumo di memoria con avr-size oppure no?
Tanto per capire dove andiamo a cascare..
no, come si fa?
Compili lo sketch senza farne l'upload e con la modalità verbose attiva.
Nel terminale dell'IDE leggi dove sono stati creati i file temporanei del progetto e ti sposti in quella cartella.
Lì dai il comando:
avr-size -C nomeFirmware.cpp.elf
Poi hai una miriade di invocazioni ad una funzione ToSerial che altro non fa che stampare stringhe sulla seriale. Peccato che tutte quelle stringhe gliele passi dalla Ram.
si, ma solo con il define DEBUG a 1
.
No, sempre! Il check se hai la modalità debug attiva lo fai all'interno della funzione ToSerial, quindi la funzione ToSerial viene chiamata sempre, col risultato che la variabile stringa viene sempre creata nella Ram e passata alla funzione, anche quando poi non stampi sulla seriale.
Riscrivi il codice togliendo quella funzione e mettendo un semplice Serial.println in modo da poter usare le stringhe gestite in Flash con la funzione F() e racchiudendo tutto tra #define se vuoi stampare solo in caso di debug.
già ho provato ad usare F() in tutto le Serial.println che non avevano all'interno variabili, ma il sistema andava lo stesso in loop.
So che così raddoppi la lunghezza del tuo codice ma elimini un sacco di occupazione di memoria.
questo non è un problema, puoi farmi un esempio? Grazie
Quindi questo:
ToSerial("Ethernet ready");
deve diventare
#if DEBUG
Serial.println(F("Ethernet ready"));
#endif
Solo in questo modo hai la certezza che:
1) includerai quel serial.println solo quando sei in modalità debug
2) una volta incluso, la stringa verrà letta dalla Flash