Инициализация раздела памяти данными во время компиляции с использованием C 11

#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() спасибо за помощь!