Attualmente sono in fase di costruzione di un sistema embedded, utilizzando un processore ARM Cortex M3, con 64 KB di SRAM. Al momento, sto cercando un modo per garantire prestazioni deterministiche con i contenitori STL, che include l'assicurazione che non riesco a finire a corto di memoria in fase di esecuzione.STL all'interno del sistema embedded con memoria molto limitata
Sono principalmente interessato a come i contenitori STL eseguono l'allocazione dinamica della memoria. Sebbene io possa utilizzare un allocatore personalizzato per far sì che queste strutture recuperino memoria da un pool che ho messo da parte, avrei bisogno di configurare un pool separato per ogni struttura per garantire che un'istanza di una struttura non possa occupare lo spazio di un'altra istanza.
Sto lavorando con altre persone su questo progetto che non vogliono occuparsi dell'allocazione grezza della memoria e preferirebbero essere in grado di utilizzare le strutture di dati "ben note" (stack, coda, deque, ecc.) . Pertanto, attualmente sto prendendo in considerazione la costruzione di wrapper attorno ai C-array per fornire queste strutture. Ciò consentirebbe l'allocazione statica della memoria necessaria per supportare questi contenitori e consentire agli altri sviluppatori di conoscere la dimensione del contenitore che hanno istanziato prima del tempo di esecuzione, in base alle informazioni sulla dimensione del codice fornite dal compilatore. A mio parere, questo garantisce che non si verifichino problemi di interruzione della memoria in fase di runtime e semplifica notevolmente la progettazione del sistema.
L'altra opzione implica l'assegnazione di contenitori STL all'inizializzazione del sistema. Dopo il periodo di inizializzazione, non potrebbe verificarsi alcuna allocazione dinamica di memoria aggiuntiva. Tuttavia, per quanto ne so, le strutture di dati standard di C++ STL non supportano questo: richiederebbe che contenitori come uno stack possano essere pre-allocati (simile a un vettore).
Gradirei commenti sulla mia proposta di creare classi attorno agli array C standard? Inoltre, esiste un modo più semplice per allocare un container STL di dimensioni statiche, come una pila o una coda di dimensioni statiche, al momento della compilazione? (So che questo è possibile con il vettore, ma gli altri non ne sono sicuro)
Nota: ho letto un'altra domanda (Embedded C++ to use STL or not), ma l'autore di questa domanda non ha chiarito la quantità di memoria che hanno aveva (altro poi come stavano usando un processo ARM7) o sembra che stia considerando una soluzione simile alla mia.
Seconda nota: sono consapevole che per alcuni sviluppatori, 64 KB di SRAM possono sembrare un sacco di memoria. In effetti, ho fatto lo sviluppo su processori AVR con una memoria significativamente inferiore, quindi comprendo questa prospettiva. Tuttavia, dalla mia attuale vista (forse non informata), 64 KB di memoria non sono molti quando si parla di contenitori STL.
Alla fine della giornata, sono andato con EASTL. Era facile da usare e funzionava bene. – BSchlinker