Странные пробелы в разделах линкеров GCC GCCC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Странные пробелы в разделах линкеров GCC GCC

Сообщение Anonymous »

tldr: в встроенной системе я должен поместить определенные буферы в их собственный раздел, который будет использоваться с DMA. Однако полученный раздел, по -видимому, содержит необъяснимые пробелы. Что может пойти не так? awk '$ 7 == 11 {print}' | Сортировать +1 -2 и слегка очищенное

Код: Выделить всё

  24000000     0 SECTION LOCAL  RAM1
24000000     0 NOTYPE  LOCAL  $d
24000000     0 NOTYPE  GLOBAL _sbss_d1
24000000   256 OBJECT  WEAK   _ZN10DmaBuffers11gUiTxBufferE
24000000     0 NOTYPE  GLOBAL __bss_d1_start__
24000100 16384 OBJECT  WEAK   _ZN10DmaBuffers13gMidiTxBufferE
24004100  8192 OBJECT  WEAK   _ZN10DmaBuffers12gUsbTxBufferE
24006100 16384 OBJECT  WEAK   _ZN10DmaBuffers12gUsbRxBufferE
2400a100 16384 OBJECT  WEAK   _ZN10DmaBuffers11gUiRxBufferE
2400e100     0 NOTYPE  LOCAL  $d
2400e100 49152 OBJECT  WEAK   gDcoBuffers
2401e200     0 NOTYPE  LOCAL  $d
2401e200    32 OBJECT  GLOBAL gDebugRxBuffer
2401e220     0 NOTYPE  LOCAL  $d
2401e220  1248 OBJECT  GLOBAL _ZN7CvMuxer11sDacBuffersE
2401e700     0 NOTYPE  GLOBAL __bss_d1_end__
2401e700     0 NOTYPE  GLOBAL _ebss_d1
Обратите внимание, что существует промежуток байтов 16640 байтов между 2401A100 - 2401E200 , где, кажется, не назначено. Изменение порядка объявления объектов, кажется, иногда генерирует еще больше пробелов. < /P>
Более подробно, у меня есть следующие объекты < /p>

Код: Выделить всё

... in a header far far away, a long long time ago...
#define DMA1AND2_BUFFER_ZEROED __attribute__((section("RAM1")))
... in another header ...
namespace DmaBuffers
{
// Hardware buffers which need to be placed in RAM D1 to be accessible to
// DMA
inline constinit RxBufferedType::ExternalBufferType  gUiRxBuffer DMA1AND2_BUFFER_ZEROED = {};
inline constinit RxBufferedType::ExternalBufferType  gUsbRxBuffer DMA1AND2_BUFFER_ZEROED = {};

inline constinit UsbTxBufferedType::ExternalBufferType gUsbTxBuffer DMA1AND2_BUFFER_ZEROED = {};

inline constinit MidiTxBufferedType::ExternalBufferType gMidiTxBuffer DMA1AND2_BUFFER_ZEROED = {};

inline constinit TxBufferedType::ExternalBufferType gUiTxBuffer DMA1AND2_BUFFER_ZEROED = {};

}
... in a source file ...
inline constinit DebugUartRxBufferedType::ExternalBufferType  gDebugRxBuffer DMA1AND2_BUFFER_ZEROED = {};
... yet another source file ...
inline constinit DcoPulseBufferType gDcoBuffers[kNumVoices] DMA1AND2_BUFFER_ZEROED = {};
< /code>
ExternalBufferType
is std :: array , где размер зависит от различных объявлений, dcopulsebuffertype является std :: ray
this a -код. Шаблоны объявляют эти буферы, но самое большое выравнивание составляет 32 (длина линии кэша), что нигде далеко не достаточно, чтобы объяснить разрыв 16 КБ (который даже не выровнен на 16 КБ).

Код: Выделить всё

RAM1 (NOLOAD) :
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss section */
_sbss_d1 = .;         /* define a global symbol at bss start */
__bss_d1_start__ = _sbss_d1;

KEEP(*(RAM1))
_ebss_d1 = .;         /* define a global symbol at bss end */
__bss_d1_end__ = _ebss_d1;
} >RAM_D1
< /code>
The flags I believe are relevant are -O3 -ffunction-sections -fdata-sections
и для линкера -static -gc -section . Набор инструментов-ARM-None-Eabi-GCC 13.2.

Подробнее здесь: https://stackoverflow.com/questions/797 ... r-sections
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»