Скрипт компоновщика GCC - разделение раздела .bss на несколько областей RAM

Встроенное устройство имеет две области SRAM. Сначала 0x20000000 и длина 16k. Тогда по адресу 0x20040000 длина 96к. В приложении размер результирующего раздела .bss составляет 102 КБ, поэтому он не помещается ни в одну из областей ОЗУ. Его нужно разделить между двумя регионами. Как это сделать в скрипте компоновщика .ld?

Я знаю два непонятных варианта.

Вариант A: вручную выберите объекты по имени в сценарии и разделите их на две части. С этой опцией я чувствую, что делаю вручную то, что должен делать компоновщик.

Вариант B: разместить атрибуты в исходном коде, чтобы некоторые объекты попали в специальный раздел .bss2. Этот даже хуже, чем вариант А.

Я хочу, чтобы компоновщик автоматически оптимально разделял объекты по двум областям памяти. Я знаю, что по крайней мере компоновщик IAR делает это оптимально без какой-либо ручной работы.


person ckain    schedule 19.05.2021    source источник
comment
Что показали ваши исследования в документации по компоновщику и / или в Интернете?   -  person the busybee    schedule 19.05.2021
comment
Здесь есть повторяющийся вопрос без ответа: stackoverflow.com/questions/15156201/   -  person Tagli    schedule 19.05.2021


Ответы (1)


Я передаю это от сотрудника NXP:
Компоновщик GNU просматривает файл сценария компоновщика линейным образом и не пытается заполнить что-то или распределить переменные в разные области памяти.
Вы должны создать bss2 и инициализируйте его в файле запуска, затем выберите вариант A или B. Вы также можете использовать другую цепочку инструментов, большинство из них может распределять переменные в разные разделы памяти.

Сценарий компоновщика:

.bss2 :
  {
    . = ALIGN(4);
    __bss2_start__ = .;
    *(.bss2)
    *(.bss2.*)
    . = ALIGN(4);
    __bss2_end__ = .;
  } > RAM2 AT > RAM2
person GabrielT    schedule 20.05.2021