Ho alcuni dati costanti che voglio memorizzare in ROM poiché ne esiste una buona quantità e sto lavorando con un dispositivo embedded ARM7 con vincoli di memoria. Sto cercando di farlo usando strutture che simile a questa:Memorizzare le strutture nella ROM sul dispositivo ARM
struct objdef
{
int x;
int y;
bool (*function_ptr)(int);
some_other_struct * const struct_array; // array of similar structures
const void* vp; // previously ommittted to shorten code
}
che ho poi creare e inizializzare come globali:
const objdef def_instance = { 2, 3, function, array, NULL };
Tuttavia, questo mangia un po 'di RAM, nonostante la const
all'inizio. Più specificamente, aumenta significativamente la quantità di dati RW e alla fine fa bloccare il dispositivo se vengono create abbastanza istanze.
Sto usando uVision e il compilatore ARM, insieme al kernel RTX in tempo reale.
Qualcuno sa perché questo non funziona o conosce un modo migliore per archiviare dati eterogenei strutturati nella ROM?
Aggiornamento
Grazie a tutti per le vostre risposte e le mie scuse per non tornare a voi ragazzi in precedenza. Quindi ecco il punteggio finora e alcune osservazioni aggiuntive da parte mia.
Purtroppo, __attribute__
ha un effetto zero su RAM vs ROM e lo stesso vale per static const
. Non ho ancora avuto il tempo di provare la via dell'assemblaggio.
I miei colleghi e io abbiamo scoperto un comportamento più insolito, però.
In primo luogo, devo notare che, per semplicità, non ho menzionato che la mia struttura objdef
contiene un campo const void*
. Il campo viene talvolta assegnato un valore da una tabella stringa definita come
char const * const string_table [ROWS][COLS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3, function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->RAM
string_table
è nella ROM come previsto. Ed ecco il kicker: le istanze di objdef
vengono inserite nella ROM fino a quando uno dei valori in string_table
viene assegnato a quel campo const void*
. Successivamente l'istanza della struct viene spostata nella RAM.
Ma quando string_table
viene modificato in
char const string_table [ROWS][COLS][MAX_CHARS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3,function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->ROM
quelle istanze di objdef
sono collocati in ROM nonostante ciò const void*
assigment. Non ho idea del perché questo dovrebbe avere importanza.
Sto iniziando a sospettare che Dan abbia ragione e che la nostra configurazione sia incasinata da qualche parte.
Provare a dichiarare come 'const statico'. Ho notato che alcuni compilatori copieranno i dati dalla ROM allo stack quando viene dichiarato come 'const'; l'accesso diretto alla ROM si verifica quando viene applicato 'static const'. –
C++ 'const' non significa" fisicamente di sola lettura ". Puoi avere const_cast, per una cosa .. –
So che puoi sempre eseguire un const_cast, ma mi sono imbattuto in un certo numero di risorse sul web che suggerivano di usare 'const' per ottenere i dati memorizzati nella ROM. A parte questo, ho imparato attraverso l'esperienza che 'const' a volte ma non sempre ha questo effetto. Ovviamente non sono del tutto chiaro quando o perché. :) – dandan78