Go Down

Topic: memory free... ma siamo sicuri? (Read 1 time) previous topic - next topic

BigByte

Ciao,
ho scritto uno sketch per capire meglio come funziona l'allocazione della memoria, forse non è il modo migliore ma devo inziare da qualche parte, comunque questo è lo sketch

Code: [Select]

#include <FreeMemory.h>

#define LEN_VET 1024

byte vet1[LEN_VET];

void setup() {                 
  Serial.begin(19200);
 
  Serial.println(freeMemory());
 
  for(int i=0;i<LEN_VET;i++) {
    vet1[i] = i;
  } 

  Serial.println(freeMemory()); 
  gen();   
  Serial.println(freeMemory());   
}

void loop() {       
//... 
}

void gen()
{
     byte vet2[LEN_VET];
     
     for(int i=0;i<LEN_VET;i++) {
        vet2[i] = i;
        //Serial.print(vet2[i]);
     }
     Serial.println(freeMemory());   
}


il riusltato è

816
816
814
816

dopo l'istanza del primo vettore sono disponibili 816 byte ?
La quantità di memoria anche dopo l'allocazione non cambia (va bhè qui era scontato ma volevo conferma).
La cosa che più non comprendo è che nella funzione gen() alloco di nuovo un vettore pari al primo, e la memoria disponibile in quel momento è di 814  :smiley-slim: ?!?! ma come ho allocato un array di 1024 e mi occupa solo 2 byte?
Finita la funzione la memoria ritorna al valore di prima.
Qualcuno saprebbe dirmi cosa succede?
ah... dimenticavo è con Arduino uno 

Grazie

m_ri

vet2 è una "variabile locale"..quando esci dalla funzione che l'ha creata,ossia gen,viene disallocata...

leo72


vet2 è una "variabile locale"..quando esci dalla funzione che l'ha creata,ossia gen,viene disallocata...

Quoto. Dichiara vet2 globale.

leo72


dopo l'istanza del primo vettore sono disponibili 816 byte ?

Nei 2048 byte di SRAM non ci sta solo il vettore di 1024 byte che hai dichiarato ma anche tutte le altre variabili create dal programma (stai usando la seriale, che è una libreria contenuta nel core, poi stai usando la libreria esterna FreeMemory) nonché lo stack del programma.

BigByte



dopo l'istanza del primo vettore sono disponibili 816 byte ?

Nei 2048 byte di SRAM non ci sta solo il vettore di 1024 byte che hai dichiarato ma anche tutte le altre variabili create dal programma (stai usando la seriale, che è una libreria contenuta nel core, poi stai usando la libreria esterna FreeMemory) nonché lo stack del programma.


Si ok su questo ci siamo. Quello che non capisco è: se io dichiaro vet1 come globale io mi aspetto che sia allocato staticamente ed infatti la freeMemory() mi dice che ho liberi solo 816byte, nel momento in cui io chiamo la funzione nella quale è dichiarato vet2 di 1024byte questo deve essere allocato in memoria e se chiamo la freeMemory() mi dovrebbe dare 0 o comunque dovrebbe bloccarsi ed invece la freeMemory mi dà 814byte, cioè come se avesse allocato solo un puntatore....Perchè?

Go Up