сохранение структур в ПЗУ на устройстве ARM

У меня есть некоторые постоянные данные, которые я хочу сохранить в ПЗУ, поскольку их довольно много, и я работаю со встроенным устройством 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 * присвоение. Я понятия не имею, почему это должно иметь значение.

Я начинаю подозревать, что Дэн прав и что наша конфигурация где-то испорчена.

5
задан dandan78 14 February 2011 в 10:18
поделиться