Vorrei sapere quanta RAM sto usando nel mio progetto, per quanto ne so, non c'è modo di risolverlo (se non quello di attraversarlo e calcolarlo da solo). Sono arrivato a un palcoscenico in un progetto piuttosto ampio in cui ho determinato che sto esaurendo la RAM.
Ho deciso questo perché posso aggiungere una sezione e poi si scatena l'inferno da qualche altra parte nel mio codice senza una ragione apparente. Se ho #ifndef
qualcos'altro, funziona di nuovo. Non c'è nulla di programmaticamente sbagliato nel nuovo codice.
Ho sospettato per un po 'che stavo arrivando alla fine della RAM disponibile. Non penso di usare troppi stack (anche se è possibile), qual è il modo migliore per determinare quanta RAM sto effettivamente usando?
Passando attraverso e cercando di risolverlo, ho problemi quando arrivo a enumerazioni e strutture; quanta memoria costano?
prima modifica: INOLTRE, ho modificato il mio sketch così tanto dall'inizio, questi non sono i risultati effettivi che ho ottenuto inizialmente, ma sono quello che sto ottenendo ora.
text data bss dec hex filename
17554 844 449 18847 499f HA15_20140317w.cpp.elf
16316 694 409 17419 440b HA15_20140317w.cpp.elf
17346 790 426 18562 4882 HA15_20140317w.cpp.elf
La prima riga (con testo 17554) non funzionava, dopo molte modifiche, la seconda riga (con testo 16316) funziona come dovrebbe.
modifica: la terza riga ha tutto funzionante, lettura seriale, nuove funzioni, ecc. Ho sostanzialmente rimosso alcune variabili globali e un codice duplicato. Ne parlo perché (come sospettato) non si tratta di questo codice per sae, ma di utilizzo della RAM. Il che mi riporta alla domanda originale, "come misurarla al meglio" Sto ancora verificando alcune risposte, grazie.
Come interpreto effettivamente le informazioni di cui sopra?
Finora la mia comprensione è:
`TEXT` is program instruction memory
`DATA` is variables (unitialised?) in program memory
`BSS` is variables occupying RAM
poiché BSS è considerevolmente inferiore a 1024 byte, perché il secondo funziona, ma il primo no? Se è DATA+BSS
allora occupano entrambi più di 1024.
ri-modifica: ho modificato la domanda per includere il codice, ma ora l'ho rimosso perché in realtà non aveva nulla a che fare con il problema (a parte forse pratiche di codifica scadenti, dichiarazioni di variabili e simili). Puoi rivedere il codice guardando indietro attraverso le modifiche se vuoi davvero vederlo. Volevo tornare alla domanda a portata di mano, che era più basata su: come misurare l'utilizzo della RAM.
String
tipo nei tuoi programmi? Questo è noto per eseguire frequenti allocazioni e rilasci di memoria dinamica, che possono frammentare l'heap fino al punto in cui non è possibile lasciare memroy.
String
s a causa del sovraccarico. Sono contento di lavorare con gli array di caratteri, detto questo, quasi sempre definisco tutti i miei array di caratteri con una dimensione fissa (al momento, ho una matrice di byte che non è puramente perché cambio la lunghezza del contenuto per differenti ricompilazioni.