#c #memory #structure #global #constexpr
Вопрос:
я пытаюсь инициализировать определенный раздел в моем DRAM/IRAM с помощью некоторых заранее определенных данных.
Для этой цели я определил раздел «my_section» в файле карты памяти по некоторому фиксированному адресу.
dram0_0 : C : 0x5ffd0400 - 0x5ffdb70f : .my_section.rodata ....
Затем я определил структуру с парой полей и списком инициализации
struct ParamBuff { int32_t first_val; int32_t second_val; constexpr ParamBuff() : first_val(0xcafecafe),second_val(0xdeadbeaf){}; };
а затем я объявил переменную, назначив ее определенному мной разделу:
__attribute__((section(".my_section.rodata"))) constexpr ParamBuff param_buff;
позже в коде я хотел бы использовать его как:
some_variable = param_buff.first_val
Так что это работает нормально, но не во время компиляции — просматривая файл сборки, я вижу, что фактическая инициализация этой структуры (и неизбежно раздела памяти) происходит во время выполнения:
5ffe1720 lt;_GLOBAL__I_a..MG_1638106100gt;: 5ffe1720: 004136 entry a1, 32 5ffe1723: fffe21 l32r a2, 5ffe171c (deadbeaf lt;xthals_hw_configid0 0x1cad0c29gt;) 5ffe1726: fffb31 l32r a3, 5ffe1714 (5ffd0400 lt;_params_array_startgt;) 5ffe1729: fffb81 l32r a8, 5ffe1718 (cafecafe lt;xthals_hw_configid0 0x8fe1878gt;) 5ffe172c: 0389 s32i.n a8, a3, 0 5ffe172e: 1329 s32i.n a2, a3, 4 5ffe1730: f01d retw.n
потеря циклов процессора, памяти команд и памяти данных (становится критической, когда этот массив становится все больше и больше)
Моя конечная цель-получить двоичный выходной файл, в котором в этом разделе памяти уже хранятся данные
Мне уже удалось сделать это с постоянными глобальными переменными, но я не могу понять, как это сделать со структурой.
Работа с C 11
Я был бы очень признателен за любую помощь!
Спасибо, Итай
Комментарии:
1. Я думаю , что лучшим решением было бы сделать структуру структурой типа «простые старые данные», которую вы можете инициализировать при определении (например
ParamBuf param_buf = { 0xcafecafe, 0xdeadbeaf };
, с подходящим атрибутом для раздела).2. Я могу попробовать это, но я хотел использовать список инициализации, чтобы избежать ошибок при инициализации этого параметра.
3. в конце концов, я воспользовался вашим предложением с небольшим изменением, и оно сработало: ParamsArray param_array = ParamsArray() спасибо за помощь!