Как вы гарантируете, что раздел компоновщика не получит выделенную флэш-память

В настоящее время я работаю над добавлением раздела .ccmbss в свой скрипт компоновщика, где я пытаюсь разместить некоторые неинициализированные переменные/структуры. Этот раздел отличается от обычного раздела .bss, ключевое отличие которого заключается в том, что .ccmbss находится в ОЗУ, связанном с ядром, а .bss — в обычном ОЗУ.

Когда я пытаюсь поместить большую неинициализированную структуру (~ 32 КБ) в раздел .ccmbss, используя обозначение C __attribute__((section(.ccmbss))), я замечаю, что она получает выделенный раздел флэш-памяти того же размера. Однако, когда я явно не устанавливаю его для перемещения в раздел .ccmbss, он размещается в разделе .bss (как и ожидалось) и не занимает места во флэш-памяти.

Любые идеи относительно того, как гарантировать, что раздел ccmbss не получит связанную флэш-память?

Вот ключевая часть файла компоновщика, над которым я работаю:

 .ccm : {
  . = ALIGN(4);
  _siccmram = .;
  *(.ccm)
  _eiccmram = .;
  . = ALIGN(4);
 } >ccm AT >app
 _ccm_loadaddr = LOADADDR(.ccm);
 
 .ccmbss : {
  . = ALIGN(4);
  *(.ccmbss)
  *(.ccmbss*)
  . = ALIGN(4);
  _eccmbss = .;
  _eccmram = .;
 } >ccm
 
 .data : {
  _data = .;
  *(.data*)
  . = ALIGN(4);
  _edata = .;
 } >ram AT >app
 _data_loadaddr = LOADADDR(.data);
 
 .bss : {
  *(.bss*)
  *(COMMON)
  . = ALIGN(4);
  _ebss = .;
 } >ram

person Daniel Fay    schedule 08.07.2021    source источник
comment
Попробуйте добавить @nobits, как в stackoverflow.com/questions/6252812/ . Похоже, GCC __attribute__((section(..))) добавляет progbits по умолчанию   -  person Eugene Sh.    schedule 08.07.2021
comment
@ЕвгенийШ. Я думаю, что # также нужен для добавления комментария в вывод сборки, как описано в верхнем ответе на вопрос, на который вы ссылаетесь.   -  person Ian Abbott    schedule 08.07.2021
comment
@IanAbbott Да, я хотел указать этот вопрос / ответ в качестве справочного материала для получения полной информации, извините, если неясно.   -  person Eugene Sh.    schedule 08.07.2021


Ответы (1)


Итак, похоже, что Евгений и Ян были на правильном пути, но, к сожалению, у меня это не сработало, так как я использую компилятор, специфичный для ARM (arm-none-eabi-gcc), который выдавал ошибки при первом же обнаружении. запятая в __attribute__((section(".ccmbss,/"aw/",@nobits#))): Error: junk at end of line, first unrecognized character is `,'

Потратив слишком много времени на попытки исправить это (прагмы, спецификатор zero_init для __attribute__((section()))), я нашел решение здесь. Решение состояло в том, чтобы переименовать .ccmbss в .bss.ccm, чтобы раздел по умолчанию имел тип раздела %nobits, что не позволяет разделу занимать место в ПЗУ.

Спасибо за помощь!!

person Daniel Fay    schedule 09.07.2021
comment
Если эта строка __attribute__((section(".ccmbss,/"aw/",@nobits#))) дословная, то ваши косые черты обратные. Чтобы избежать двойных кавычек, вам нужна обратная косая черта. Также отсутствуют закрывающие кавычки, как в __attribute__((section(".ccmbss,\"aw\",@nobits#"))). В любом случае, вы нашли правильное решение, но для общих разделов оно все же должно подойти. - person Eugene Sh.; 09.07.2021