У меня есть некоторые постоянные данные, которые я хочу сохранить в ПЗУ, поскольку их довольно много, и я работаю со встроенным устройством ARM7 с ограничением памяти. Я пытаюсь сделать это, используя структуры, которые выглядят примерно так:
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
}
, которые я затем создаю и инициализирую как глобальные объекты:
const objdef def_instance = { 2, 3, function, array, NULL };
Однако это съедает довольно много оперативной памяти, несмотря на const
в начало. В частности, это значительно увеличивает объем RW-данных и, в конечном итоге, приводит к блокировке устройства, если создается достаточное количество экземпляров.
Я использую uVision и компилятор ARM вместе с ядром реального времени RTX.
Кто-нибудь знает, почему это не работает, или знает лучший способ хранить структурированные разнородные данные в ПЗУ?
Обновление
Спасибо всем за ваши ответы и мои извинения за то, что не ответили вам раньше, ребята. Итак, вот результат и некоторые дополнительные наблюдения с моей стороны.
К сожалению, __ attribute __
не оказывает никакого влияния на RAM по сравнению с ROM, и то же самое касается static const
. У меня еще не было времени опробовать маршрут сборки.
Однако мои коллеги и я обнаружили еще одно необычное поведение.
Во-первых, Я должен отметить, что для простоты я не упомянул, что моя структура objdef
содержит поле const void *
. Поле иногда назначается значение из таблицы строк, определенной как
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
находится в ПЗУ, как и ожидалось. И вот что интересно: экземпляры objdef
помещаются в ПЗУ до тех пор, пока одно из значений в string_table
не будет присвоено этому полю const void *
. После этого экземпляр структуры перемещается в ОЗУ.
Но когда 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
, эти экземпляры objdef
помещаются в ПЗУ, несмотря на то, что const void *
присвоение. Я понятия не имею, почему это должно иметь значение.
Я начинаю подозревать, что Дэн прав и что наша конфигурация где-то испорчена.