Frugando il lavoro di altri programmatori ho trovato la seguente funzione per Arduino Uno
---------------------------------------------------------
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
---------------------------------------------------------
Da
questo link si puo' leggere che la funzione riporta lo spazio di memoria Ram del Atmega328 libero.
Usando questa funzione si puo' osservare come il compilatore ottimizzi il codice. Se per esempio viene dichiarata una stringa ma non viene utilizzata, il compilatore non alloca spazio di memoria per la stringa
Un altro trucco e' il seguente
Serial.print("luca");
occupa 5 byte (4 caratteri + null) mentre
Serial.print(F("luca"));
non occupa spazio in RAM perche' la stringa viene spostata nella flash memory e non nella ram. Questo trucco funziona per le stringhe statiche .. Serial.print(F(variabile_stringa)) usa lo spazio Ram
Lo sketch di seguito riportato indica uno spazio libero di 1819 bytes.
----------------------------------------------------------------------
//char str[] = "Hello, world!";
void setup() {
Serial.begin(115200);
}
void loop() {
//Serial.println(str);
Serial.println(freeRam());
delay(10000);
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}