Go Down

Topic: problema di memoria con le stringhe (Read 1 time) previous topic - next topic

stefa24

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

https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
https://www.youtube.com/channel/UCnY1DNrSywgadjyqqtbvyew

leo72

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.

stefa24

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
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
https://www.youtube.com/channel/UCnY1DNrSywgadjyqqtbvyew

leo72

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

stefa24

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
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
https://www.youtube.com/channel/UCnY1DNrSywgadjyqqtbvyew

m_ri

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

leo72

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.

brunialti

#7
Aug 29, 2012, 11:42 am Last Edit: Aug 29, 2012, 01:47 pm by brunialti Reason: 1
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.

Go Up