giovedì 28 marzo 2019

Occupazione memoria Arduino Uno

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);
}

Nessun commento:

Posta un commento