Tengo algunos datos constantes que quiero almacenar en la ROM, ya que hay una buena cantidad y estoy trabajando con un dispositivo ARM7 incrustado de memoria. Estoy tratando de hacer esto utilizando las estructuras que se parecen algo como esto:almacenando estructuras en la ROM en el 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
}
que luego crear e inicializar como globales:
const objdef def_instance = { 2, 3, function, array, NULL };
Sin embargo, esto consume un poco de memoria RAM a pesar de la const
al principio. Más específicamente, aumenta significativamente la cantidad de datos RW y, finalmente, hace que el dispositivo se bloquee si se crean suficientes instancias.
Estoy usando uVision y el compilador ARM, junto con el núcleo RTX en tiempo real.
¿Alguien sabe por qué esto no funciona o sabe una mejor manera de almacenar datos heterogéneos estructurados en la ROM?
actualización
Gracias a todos por sus respuestas y mis disculpas por no volver a estar con ustedes antes. Así que aquí está la puntuación hasta el momento y algunas observaciones adicionales de mi parte.
Lamentablemente, __attribute__
tiene un efecto nulo en la RAM frente a la ROM y lo mismo ocurre con static const
. Todavía no he tenido tiempo de probar la ruta de ensamblaje.
Mis compañeros de trabajo y yo hemos descubierto un comportamiento más inusual.
En primer lugar, debo señalar que por simplicidad no mencioné que mi estructura objdef
contiene un campo const void*
. El campo a veces se le asigna un valor de una tabla de cadenas definido como
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
es en la ROM como se esperaba. Y aquí está el truco: las instancias de objdef
se ponen en la ROM hasta que uno de los valores en string_table
se asigna a ese campo const void*
. Después de eso, la instancia de struct se mueve a la RAM.
Pero cuando se cambia a string_table
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
esas instancias de objdef
se colocan en la memoria ROM a pesar de que const void*
assigment. No tengo idea de por qué esto debería importar.
Estoy empezando a sospechar que Dan tiene razón y que nuestra configuración está arruinada en alguna parte.
Intenta declarar como 'const' estático. Noté que algunos compiladores copiarán los datos de la ROM para apilarlos cuando solo se declaran como 'const'; el acceso directo a la ROM ocurre cuando se aplica 'const estático '. –
C++ 'const' no significa" físicamente solo lectura ". Puede tener const_cast, por un lado. –
Sé que siempre puede realizar un const_cast, pero me encontré con una serie de recursos en la web que sugerían usar 'const' para obtener datos almacenados en la ROM. Aparte de esto, he aprendido a través de la experiencia que 'const' algunas veces pero no siempre tiene este efecto. Obviamente, no tengo muy claro cuándo ni por qué. :) – dandan78