Forums

Full Version: Come RISPARMIARE memoria Arduino
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Ciao a tutti,
molti utenti hanno sviluppato un App µPanel a più schermate (quindi usando più volte l'istruzione "Serial.println("....") ) ma hanno notato un'occupazione di memoria molto elevata dello sketch Arduino. Ad alcuni, in fase di compilazione è anche comparso l'errore "memoria insufficiente".
A prima vista, si può pensare che le varie stringhe HTCML dei pannelli hanno saturato la memoria programma, ma in realtà quella che si è esaurita è la RAM.

Il motivo è che le stringhe di testo presenti le codice vengono sempre allocate in RAM, anche se sono dei semplici testi dentro una Serial.print() e, quindi, non ci sembrano associate a una variabile.  


SOLUZIONE

La soluzione è semplice, basta dire al compilatore che per tutte le stringhe di testo COSTANTI contenute nei vari Serial.print non vanno allocate in RAM.
Sostituite:

Code:
Serial.print ("....") >>>>>>>>>>  Serial.print (F("...."));

Serial.println("....") >>>>>>>>>>  Serial.println (F("...."));


Questo va fatto solo per i "Serial.print" che contengono stringhe di testo COSTANTI e non per i "Serial.print" che contengono variabili.

Con questa semplice accortezza, anche il più piccolo Arduino potra contentere decine di pannelli µPanel!
Ciao,
quindi per la definizione dei pannelli si può usare Serial.println (F("...."));
mentre per l'aggiornamento delle variabili all'interno dei pannelli Serial.println("....")

Esempio:
void setup()
Serial.println(F("$P:/L1G*15:0:Blinking;"));


void loop() {

delay(500); // Wait 0.5 s
Serial.println("#L11"); // Turn ON LED 1
......
}
ho capito bene?
Grazie
No anche il
Serial.println("#L11");
lo puoi scrivere
Serial.println(F("#L11"));
in quanto non è una variabile.

In sostanza tutti i contenuti compresi tra le " " dei serial.print sono delle costanti e li puoi scrivere anteponendo la F (che sta per memoria FLASH) il resto no.