Initialisierung des Arrays ab einer bestimmten Adresse im Speicher - C-Programmierung

8

Haben Sie eine Idee, Array von Strukturen zu initialisieren, beginnend mit einer bestimmten Adresse im Speicher (nicht virtuell, physikalischer DDR-Speicher). Ich arbeite an der Implementierung von TxRx auf SoC (ARM-FPGA). Grundsätzlich kommunizieren ARM (PS) und FPGA (PL) miteinander, indem sie einen gemeinsamen RAM-Speicher verwenden. Derzeit arbeite ich auf der Senderseite, also muss ich ständig Pakete laden, die ich von der MAC-Schicht in den Speicher bekomme, dann liest mein Tx Daten und sendet sie in Luft. Um dies zu erreichen, möchte ich einen zirkulären FIFO-Puffer auf der (ARM-) Seite implementieren, so dass ich bis zu 6 Pakete in den Puffer speichern und sie einzeln nacheinander senden kann, während andere Pakete auf bereits gesendete Pakete geladen werden. Da ich bestimmte Speicheradressen, die ich interessiere, verwenden muss, ist es möglich, ein Array von Strukturen zu initialisieren, die an bestimmten Adressen im Speicher gespeichert werden. Zum Beispiel möchte ich, dass mein Array an Adresse 0x400000 beginnt und an Adresse 0x400000 + MaximumNumberOfPackets x SizeOfPackets endet Ich weiß, wie es für eine Instanziierung der Struktur zum Beispiel so geht: buffer_t * tmp = (Strukturpuffer_t *) 234881024;

Aber wie macht man das für ein Array von Strukturen?

    
elem 11.02.2015, 21:47
quelle

3 Antworten

5

Ein Zeiger auf eine einzelne Struktur (oder int, float oder irgendetwas anderes) ist inhärent ein Zeiger auf ein Array von ihnen. Der Zeigertyp liefert den Wert sizeof () für einen Array-Eintrag und ermöglicht so die Zeigerarithmetik.

Wenn Sie also struct buffer angeben, können Sie dies einfach tun

%Vor%

und dann einfach auf myFIFO als Array zugreifen

%Vor%

Dies funktioniert genau so, wie Sie es erwarten.

Was Sie nicht tun können (mit reinem Standard C), deklarieren Sie ein Array an einer bestimmten Adresse wie folgt:

%Vor%

Der Compiler darf jedoch Erweiterungen haben, um dies zu ermöglichen. Viele Embedded-Compiler tun das (immerhin deklarieren sie häufig Speicherregister für Speicherkarten), aber das wird für jeden Compiler-Hersteller anders sein und möglicherweise für jeden Chip, da es sich um eine Vendor-Erweiterung handelt.

GCC erlaubt es für AVR-Prozessoren über ein Attribut, zum Beispiel

%Vor%

Aber es scheint es nicht für einen ARM zu unterstützen.

    
kdopen 11.02.2015, 22:16
quelle
2

Im Allgemeinen ist @kdopen richtig, aber für den Arm sollten Sie einen Eintrag im Linker-Skript des MEMORY-Bereichs erstellen, der dem Linker anzeigt, wo sich Ihr Speicher befindet:

%Vor%

Und wenn Sie Variablen deklarieren, verwenden Sie einfach

%Vor%     
Gaskoin 11.02.2015 22:24
quelle
0

Ich habe den Weg gefunden, wie es geht. Also könnte ich es so machen. Ich habe dies in Linker-Skript gesetzt:

%Vor%

Und dann setze ich das in Code

%Vor%     
elem 23.03.2015 16:43
quelle

Tags und Links