Arduino Forum

International => Italiano => Software => Topic started by: stefa24 on Aug 28, 2012, 09:20 am

Title: problema di memoria con le stringhe
Post by: stefa24 on Aug 28, 2012, 09:20 am
ciao
stavo cercando di risolvere alcuni problemi di comunicazione con una SD card reader che ho risolto, ma ponendo la questione nella sezione Storage del forum
http://arduino.cc/forum/index.php/topic,119759.15.html
ho avuto anche questa risposta dove si dice che con le stringhe ci possono essere problemi di memoria

Code: [Select]

There is a serious bug in the dynamic memory free() function that can cause String to crash.

http://arduino.cc/forum/index.php/topic,115552.0.html

Fixes are presented in the above topic.

The problem may also cause SD.h to crash if many files are opened an closed.


seguendo i link sono arrivato a una discussione, con sketch, dove se ne parla in modo piu' approfondito, ma ci ho capito poco, qualcuno a qualche informazione in merito a questi problemi di memoria

grazie
stefano

Title: Re: problema di memoria con le stringhe
Post by: leo72 on Aug 28, 2012, 10:29 am
Bisognebbe vedere come viene gestito l'oggetto String dalla relativa libreria, dato che si tratta di un particolare array dinamicamente modificabile. Forse con free() vengono eliminati anche elementi che fanno ancora parte di un oggetto String.
Title: Re: problema di memoria con le stringhe
Post by: stefa24 on Aug 28, 2012, 01:04 pm
ciao
ho letto seguendo i link ma ci ho capito poco soprattutto per ignoranza, volevo capire quali probabilita' ci possono essere di imbattersi in questo problema, ma cosa e' free()?
grazie
stefano
Title: Re: problema di memoria con le stringhe
Post by: leo72 on Aug 28, 2012, 01:08 pm
Riguarda l'allocazione dinamica della memoria. Sono argomenti ostici, neanch'io ci sono bene addentro. Ed il "casino" aumenta quando le tecniche usate sui computer vengono applicate ai microcontrollori.
http://en.wikipedia.org/wiki/C_dynamic_memory_allocation
Title: Re: problema di memoria con le stringhe
Post by: stefa24 on Aug 28, 2012, 01:37 pm
ciao
immaginavo leggendo senza capire molto ho immaginato che non fosse roba per comuni mortali, soprattutto se scritta non in italiano, spero di non sbatterci, con la mia applicazione

grazie
stefano
Title: Re: problema di memoria con le stringhe
Post by: m_ri on Aug 28, 2012, 09:50 pm
c'è un baco nelle librerie avr circa malloc() and free()..dovresti aggiornare avr-libc dalla versione 1.6.4 alla 1.7..e poi non dovrebbe dare problemi..comunque,se hai da fare lavori seri dove è importante la stabilità,non usare malloc,o al massimo usale solo in fase di inizializzazione..anche xkè tra frammentazione e possibili bachi,possono dare problemi.. http://code.google.com/p/arduino/issues/detail?id=857 (http://code.google.com/p/arduino/issues/detail?id=857)
Title: Re: problema di memoria con le stringhe
Post by: leo72 on Aug 29, 2012, 12:30 am
Difatti in molti sul web sconsigliano l'uso di malloc() e free() sui microcontrollori proprio perché la loro gestione della (poca) memoria in modalità dinamica può portare più danni che benefici.
Title: Re: problema di memoria con le stringhe
Post by: brunialti on Aug 29, 2012, 11:42 am
il problema riguarda la allocazione di memoria nello heap (la parte di memoria utilizzata per allocare variabili e passare argomenti nelle funzioni).
Quando allochi memoria (p.es. 4 byte di un float) e poi la deallochi con free, i 4 byte costituiscono un "buco" nello heap teoricamente libero ma in pratica non riallocabile per mancanza di un garbage collector che gestisca i puntatori (che consumano molta memoria per allocazioni di piccole dimensioni!) alle aree di memorie liberate e che di tanto in tanto deframmenti la memoria in maniera simile al defrag di windows.
questo comporta che i "buchi" sono lasciati inutilizzati (in realtà sino a quando non si libera tutta la memoria allocata successivamente, evento raro ) e non disponibili. Dopo un po la memoria si esaurisce.
Sarebbe necessario quindi gestire internamente al programma una allocazione iniziale di un pool di memoria e/o una gestione di una malloc/free custom. Spesso non ne vale la pena, ma a volte è indispensabile. Per esempio se devi gestire delle code come liste puntate in cui si creano/distruggono spesso elementi. Io per esempio gestisco così le code di messaggi. Ho infatti visto librerie che usano creare/distruggere oggetti come istanze di una classe, con il risultato che la memoria si satura molto velocemente.