Frage

Ich bin eine Hardware-Schnittstelle unter Verwendung von Daten zu senden, die mich erfordert eine DMA Puffer einzurichten , die benötigt auf 64-Bit-Grenzen ausgerichtet werden.

Die DMA-Maschine erwartet Puffer auf mindestens 32 Bit Grenzen (4 Bytes) ausgerichtet werden. für eine optimale Leistung der Puffer sollte auf 64 Bit Grenzen (8 Bytes) ausgerichtet werden. Die Übertragungsgröße muss ein Vielfaches von 4 Bytes sein.

Ich verwende posix_memalign einen Puffer wie diese erstellen ...

posix_memalign ((void**)&pPattern, 0x1000, DmaBufferSizeinInt32s * sizeof(int) ) )

pPattern ist ein Zeiger auf einen int und ist der Beginn meiner Puffer, der tief ist DmaBufferSizeinInt32s.

Ist mein Puffer ausgerichtet auf 64bits?

War es hilfreich?

Lösung

Ja, das ist Ihre Puffer auf 64-Bit ausgerichtet sind. Es ist auch auf einer 4-KByte-Grenze (daher die 0x1000) ausgerichtet ist. Wenn Sie die 4-KB-Ausrichtung nicht dann wollen passieren 0x8 statt 0x1000 ...

Edit: Ich möchte auch, dass in der Regel beachten, wenn die DMA-Ketten Schreiben Sie sie durch uncached Speicher oder durch eine Art von nicht-Cache-basierte Schreibwarteschlange schreiben. Ist dies der Fall, dass Sie Ihre DMA-Ketten an die Cache-Zeilengröße ausrichten mögen auch ein Cache-Zurückschreiben den Anfang oder das Ende der DMA-Kette zu verhindern, zu überschreiben.

Andere Tipps

Wie Goz wies darauf hin, aber (imo) etwas weniger klar: Sie fordern für die Ausrichtung von 0x1000 Bytes (das zweite Argument), die viel mehr als 64 Bits ist

.

Sie können den Anruf ändern, um nur:

posix_memalign ((void**)&pPattern, 8, DmaBufferSizeinInt32s * sizeof(int)))

Dies könnte den Anruf billiger (weniger verschwendet Speicher) machen, und in jedem Fall ist klarer, da Sie etwas fragen, das genaue übereinstimmt, was Sie eigentlich wollen.

Ich weiß nicht, Ihre Hardware und ich weiß nicht, wie Sie Ihre pPattern Zeiger bekommen, aber dies scheint rundum riskant. Die meisten DMA ich vertraut bin erfordert körperlichen kontinuierlichen RAM. Das Betriebssystem stellt nur praktisch kontinuierliche RAM Anwenderprogramme. Das bedeutet, dass eine Speicherzuweisung von 1 MB kann bis zu 256 unverbundenen 4K RAM Seiten zusammengesetzt sein.

Ein Großteil der Speicherzuordnungen Zeit der kontinuierlichen physischen Stücke gemacht werden, die Dinge arbeiten die meiste Zeit führen kann, aber nicht immer. Sie benötigen einen Kernel-Gerätetreiber sicher DMA zu liefern.

ich darüber wundern, denn wenn Ihre pPattern Zeiger ist von einem Gerätetreiber kommen, warum dann brauchen Sie es mehr ausrichten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top