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?
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
und dann einfach auf myFIFO
als Array zugreifen
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.
Tags und Links c arrays shared-memory