Seltsame Lücken in ARM GCC -Linker AbschnittenC++

Programme in C++. Entwicklerforum
Anonymous
 Seltsame Lücken in ARM GCC -Linker Abschnitten

Post by Anonymous »

TLDR: Auf einem eingebetteten System muss ich bestimmte Puffer in ihren eigenen Abschnitt platzieren, um mit DMA verwendet zu werden. Der resultierende Abschnitt scheint jedoch unerklärliche Lücken zu enthalten. Was könnte schief gehen? awk '$ 7 == 11 {print}' | Sortieren Sie +1 -2 und leicht gereinigt ist

Code: Select all

  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
Beachten Sie, dass zwischen 2401A100 - 2401E200 eine 16640 -Byte -Lücke besteht, in der nichts zugewiesen zu sein scheint. Das Ändern der Reihenfolge der Deklaration der Objekte scheint gelegentlich noch mehr Lücken zu erzeugen.

Code: Select all

... 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
ist std :: array wobei Größe von verschiedenen Deklarationen abhängt, dcopulsebuffertype ein std :: array und schließlich pulsetype 16 byte struktur. Deklarieren Sie diese Puffer, aber die größte Ausrichtung beträgt 32 (die Länge der Cache -Linie), was bei weitem nicht genug ist, um den 16 -KB -Lücken zu erklären (der ohnehin nicht einmal auf 16 KB ausgerichtet ist).

Code: Select all

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
und für die Linker -static -gc -Abschnitte . Die Toolchain ist ARM-NONE-AEBI-GCC 13.2. < /P>
N.B. Durch das Verschieben der Puffer von Kopfzeile zu Quelldateien verschwindet die Lücke. Dies scheint jedoch eher eine Problemumgehung als eine Lösung zu sein, daher bin ich immer noch daran interessiert, was hier passiert.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post