Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Variabili globali/,locali e utilizzo memoria

Linguaggi e sistemi

Moderatori: Foto UtenteMassimoB, Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Variabili globali/,locali e utilizzo memoria

Messaggioda Foto UtenteAgatino » 18 apr 2020, 2:40

Salve a tutti.
Questo post non è di risoluzione di problemi, ma di chiarimento sul funzionamento di Arduino e nello specifico di come gestisce la memoria.

Ho uno sketch più o meno complesso che al sui interno utilizza variabili globali e locali.
In fase di compilazione mi da questo messaggio di informazione finale:

Lo sketch usa 42378 byte (16%) dello spazio disponibile per i programmi. Il massimo è 253952 byte.
Le variabili globali usano 6039 byte (73%) di memoria dinamica, lasciando altri 2153 byte liberi per le variabili locali. Il massimo è 8192 byte.

Riguardo alla gestione della memoria volevo chiedere questo:

- una variabile locale inserita in una funzione alloca uno spazio in memoria X per contenere il valore della stessa.
1) Al termine della funzione la parte d memoria che contiene la variabile in questione viene deallocata oppure resta li?
2) Ad una successiva chiamata della medesima funzione, la variabile riutilizza lo spazio di memoria precedentemente allocato oppure ne aggiunge una nuova allocazione?


Chiedo questo perché dal messaggio ho visto che mi rimane poca memoria libera per le variabili locali e se queste ogni volta che vengono utilizzate "sfruttano" sempre più memoria, arriverei dopo N iterazioni a saturare la memoria disponibile (sempre se la cosa funziona così). perché se no avevo pensato di dichiare alcune variabili locali come variabili Globali che teoricamente dovrebbero allocare uno spazio definito di memoria.

Grazie in anticipo a chi mi risponderà
Avatar utente
Foto UtenteAgatino
84 1 5
Frequentatore
Frequentatore
 
Messaggi: 147
Iscritto il: 26 mar 2010, 10:36

0
voti

[2] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto Utentewruggeri » 18 apr 2020, 7:38

La domanda che poni non è relativa solo ad Arduino, ma più in generale al funzionamento dei software, per cui sposterò il topic in una sezione più opportuna.
Detto questo, le variabili locali restano allocate solo finché lo "scope" che le contiene rimane attivo: in sostanza, le variabili locali di una funzione vengono allocate quando essa comincia ad essere eseguita e vengono de-allocate appena essa termina. Non c'è garanzia che una successiva chiamata della funzione ri-allochi le variabili esattamente nello stesso posto (e infatti di solito non avviene).
Rispondo solo a chi si esprime correttamente in italiano e rispetta il regolamento.
Se non conosci un argomento, non parlarne.
Gli unici fatti sono quelli dimostrabili, il resto è opinione.
Non sono omofobo, sessista, leghista o analoghe merdate.
Avatar utente
Foto Utentewruggeri
5.429 2 8 13
Master EY
Master EY
 
Messaggi: 1106
Iscritto il: 25 nov 2016, 18:46

0
voti

[3] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto UtenteSammuele » 18 apr 2020, 9:52

Le variabili locali vengono posizionate nello stack. Se invece, sempre localmente, sei tu a crearle tramite allocazione di memoria nell'heap, devi essere tu a liberare lo spazio.
Es :
void funzione(){
int var; //allocata automaticamente nello stack
char * buffer = malloc(size); // allocata nell'heap,
free(buffer); // bisogna liberare prima di usire
}

L'allocazione nell'heap tende a frammentare la memoria, con arduino fai attenzione.
Avatar utente
Foto UtenteSammuele
65 4
Frequentatore
Frequentatore
 
Messaggi: 167
Iscritto il: 22 nov 2018, 17:05

1
voti

[4] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto Utentewruggeri » 18 apr 2020, 23:08

Io se uno mi porta un software embedded con dentro una malloc giuro che gli stacco la testa.
Rispondo solo a chi si esprime correttamente in italiano e rispetta il regolamento.
Se non conosci un argomento, non parlarne.
Gli unici fatti sono quelli dimostrabili, il resto è opinione.
Non sono omofobo, sessista, leghista o analoghe merdate.
Avatar utente
Foto Utentewruggeri
5.429 2 8 13
Master EY
Master EY
 
Messaggi: 1106
Iscritto il: 25 nov 2016, 18:46

0
voti

[5] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto UtenteSammuele » 18 apr 2020, 23:18

lol :)
ma era solo per fargli capire dai :)
Avatar utente
Foto UtenteSammuele
65 4
Frequentatore
Frequentatore
 
Messaggi: 167
Iscritto il: 22 nov 2018, 17:05

0
voti

[6] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto UtenteAgatino » 4 mag 2020, 17:30

Scusate se rispondo solo ora.

Nel software che ho scritto non faccio nessuna allocazione/deallocazione diretta.
IN linea generale il modulo arduino è in ascolto sulla porta seriale di "messaggi" che poi inserisce in una variabile di tipo stringa e valutando il valore di questa stringa intraprende delle azioni. Poi ho altre variabili di tipo array di byte che hanno dimensione fissa e vengono solo aggiornati i valori all'interno.

Quindi in generale se per esempio nella mia stringa che contiene il messaggio ricevuto dalla seriale, vado ad inserire sempre messaggi della stessa lunghezza di caratteri, una volta allocata la memoria dovrebbe rimanere sempre quella. Se invece i messaggi hanno lunghezze variabili potrei avere il problema che con il tempo saturo la memoria disponibile?
Avatar utente
Foto UtenteAgatino
84 1 5
Frequentatore
Frequentatore
 
Messaggi: 147
Iscritto il: 26 mar 2010, 10:36

0
voti

[7] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto Utentespeedyant » 5 mag 2020, 12:38

wruggeri ha scritto:Io se uno mi porta un software embedded con dentro una malloc giuro che gli stacco la testa.

Non solo, ma se qualcuno usa la classe String su arduino vuol dire "suicidarsi"... :lol:
Son quello delle domande strane!
Avatar utente
Foto Utentespeedyant
3.759 3 6 8
Master
Master
 
Messaggi: 2667
Iscritto il: 9 lug 2013, 18:29
Località: Torino

0
voti

[8] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto UtenteSammuele » 5 mag 2020, 13:02

infatti potrebbe esserci una frammentazione della memoria eccessiva.
La classe String permette di allocare prima memoria con la funzione reserve:

https://www.arduino.cc/reference/en/lan ... ingobject/
https://www.arduino.cc/reference/en/lan ... ns/reserve


Devi per forza farlo prima :)
Avatar utente
Foto UtenteSammuele
65 4
Frequentatore
Frequentatore
 
Messaggi: 167
Iscritto il: 22 nov 2018, 17:05

0
voti

[9] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto Utentespeedyant » 5 mag 2020, 13:08

Comunque è da evitare.
Son quello delle domande strane!
Avatar utente
Foto Utentespeedyant
3.759 3 6 8
Master
Master
 
Messaggi: 2667
Iscritto il: 9 lug 2013, 18:29
Località: Torino

0
voti

[10] Re: Variabili globali/,locali e utilizzo memoria

Messaggioda Foto UtenteSammuele » 5 mag 2020, 13:13

Secondo me dipende da cosa deve farci e quanta memoria ha disponibile.

Sicuramente non è la scelta migliore.
Avatar utente
Foto UtenteSammuele
65 4
Frequentatore
Frequentatore
 
Messaggi: 167
Iscritto il: 22 nov 2018, 17:05

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti