У меня есть некоторые постоянные данные, которые я хочу хранить в ПЗУ, поскольку их достаточно, и я работаю с встроенным устройством ARM7 с ограниченным объемом памяти. Я пытаюсь сделать это с помощью структур, которые выглядят примерно так:Сохранение структур в ПЗУ на устройстве 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
}
, который я затем создать и инициализировать, как глобалов:
const objdef def_instance = { 2, 3, function, array, NULL };
Однако это съедает совсем немного оперативной памяти, несмотря на const
в начале. Более конкретно, это значительно увеличивает количество данных RW и в конечном итоге заставляет устройство блокироваться, если создаются достаточные экземпляры.
Я использую uVision и компилятор ARM вместе с ядром RTX реального времени.
Кто-нибудь знает, почему это не работает или не знает лучшего способа хранения структурированных гетерогенных данных в ПЗУ?
Update
Спасибо всем за ваши ответы, и мои извинения за не получить обратно к вам, ребята, раньше. Итак, вот оценка до сих пор и некоторые дополнительные наблюдения с моей стороны.
К сожалению, __attribute__
имеет нулевой эффект на ОЗУ против ПЗУ и то же самое для 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*
распайки. Я понятия не имею, почему это имеет значение.
Я начинаю подозревать, что Дэн прав, и что наша конфигурация где-то испорчена.
Попробуйте объявить как 'static const'. Я заметил, что некоторые компиляторы будут копировать данные из ПЗУ в стек, если он объявлен только как 'const'; прямой доступ к ПЗУ возникает, когда применяется «статический const». –
C++ 'const' не означает« физически только для чтения ». У вас может быть const_cast, с одной стороны. –
Я знаю, что вы всегда можете выполнить const_cast, но я наткнулся на ряд ресурсов в Интернете, которые предложили использовать 'const' для получения данных, хранящихся в ROM. Помимо этого, я узнал из опыта, что 'const' иногда, но не всегда имеет этот эффект. Очевидно, я не совсем понимаю, когда и почему. :) – dandan78