Forum: Mikrocontroller und Digitale Elektronik Xmega DMA langsam


von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

Hallo,

ein ATXMega128a4u soll per DMA Daten aus einem Array im RAM an einen 
Port herausschieben. Er läuft mit 32 MHz. Allerdings erhalte ich 
deutlich weniger als 32 MSps, obwohl die CPU im IDLE-Mode ist. Es sind 
ca. 8 MSps. Warum?

Ich dachte, der RAM und IO sind getrennt, so dass je Zyklus eine 
Schreib- und gleichzeitig eine Leseoperation ausgeführt werden. Das 
Adressincrement sollte ja ohne Buszugriff stattfinden.

Was kann die Ursache für die geringe Geschwindigkeit sein?

von Timmo H. (masterfx)


Lesenswert?

Hast mal ein Minimalbeispiel?

von D. V. (mazze69)


Lesenswert?

32MHZ <-> 8MHz. Quotient 4.

von (prx) A. K. (prx)


Lesenswert?

Sicher, dass dieser DMA Controller für Blockdatentransfer direkt vom RAM 
zum Port ausgelegt ist? Wenn der byteweise getriggert arbeitet und für 
jedes Byte erst einmal den Bus beantragt, das Byte aus dem RAM liest, 
auf den Port schreibt und dann den Bus wieder freigibt, dann wären 4 
Takte pro Byte völlig in Ordnung.

Edit: Mal reingesehen. Der DMA Controller arbeitet offensichtlich mit 
getrennten und gepufferten Lese- und Schreiboperationen, also nicht 
direkt vom RAM zum Port. Das wären also schon einmal 2 Takte pro Byte 
Minimum. Und wenn man mit 1-Byte Bursts arbeitet, dann überträgt er eben 
1 Byte pro DMA-Transaktion, wie eben beschrieben.

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Stefan Helmert schrieb:
> Ich dachte, der RAM und IO sind getrennt, so dass je Zyklus eine
> Schreib- und gleichzeitig eine Leseoperation ausgeführt werden.

Was hat das eine mit dem anderen zu tun?

Und warum liest du nicht einfach vorher im Datenblatt nach, wieviele 
Takte ein DMA-Transfer braucht?

von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

"A write to SRAM takes one cycle, and a read from
SRAM takes two cycles. For burst read (DMA), new data are available 
every cycle." (S. 25, 
http://www.atmel.com/Images/Atmel-8331-8-and-16-bit-AVR-Microcontroller-XMEGA-AU_Manual.pdf 
)

"Since the data memory is organized as four separate sets of memories, 
the different bus masters (CPU, DMA controller
read and DMA controller write, etc.) can access different memory 
sections at the same time." (S. 24)

von (prx) A. K. (prx)


Lesenswert?

Axel Schwenke schrieb:
> Was hat das eine mit dem anderen zu tun?

Frühe DMA Controller waren teilweise so gebaut, dass sie mit den Daten 
selbst nichts zu tun hatten, sondern auf dem Datenbus eine direkte 
Verbindung zwischen Peripheriedevice und Speicher herstellten. Es also 
keine getrennten Lese- und Schreibzyklen gab, da beides in einem 
einzigen Zyklus ablief.

Beispiel hierfür ist der antike Intel 8237 im PC, der den 
Floppy-Controller bedient, so noch vorhanden. Dieses Prinzip ist aber 
etwas aus der Mode gekommen, auch der Z80 DMA arbeitete schon mit 
getrennten Zyklen.

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Ich habe gerade selber mal die Datenblätter von Atmel überflogen und muß 
feststellen, daß sie sich mit Timingangaben beim DMAC sehr zurückhalten. 
Die oben zitierte Aussage zum Speicher-Timing ist so ziemlich die 
einzige Quelle.

Damit wären je nach Betriebsart (Burstmodus) 1 oder 2 Takte für das 
Lesen aus dem SRAM nötig, ein weiterer Takt für das Schreiben [1] und 
der anscheinend 4. verbrauchte Takt dann für das Inkrementieren der 
Adreßzeiger, Dekrementieren des Blöcklängenzählers und Prüfen der 
Abbruchbedingung im DMAC.

[1] Ich gehe nicht davon aus, daß Atmel da einen echten Crossover 
zwischen den diversen Busteilnehmern implementiert. Der DMAC wird eher 
von einem Busteilnehmer lesen (in ein internes Register) und in einem 
zweiten Buszyklus auf einen anderen schreiben.

von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

Ja, aber er hat ja einen Buffer (der DMAC). Der sollte doch pipelined 
arbeiten und so das nächste Byte lesen, während er das alte rausschiebt.

von (prx) A. K. (prx)


Lesenswert?

Stefan Helmert schrieb:
> Ja, aber er hat ja einen Buffer (der DMAC). Der sollte doch pipelined
> arbeiten und so das nächste Byte lesen, während er das alte rausschiebt.

Weshalb nimmst du das an? Solch ein Verhalten wäre für DMA untypisch. 
DMA ist zur Entlastung von Hintergrundtransfers vorgesehen. Nicht für 
Blocktransfers mit maximal möglicher Tranferrate.

von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

A. K. schrieb:
> Weshalb nimmst du das an?

Naja, weil ich es so konstruieren würde. Mit wenigen % Mehraufwand 
könnte damit mehr als die doppelte Leistung erreicht werden.

von Helmut S. (helmuts)


Lesenswert?

Aus dem oben erwähnten Maual

> A bus arbiter controls when the DMA controller and the AVR CPU can use the bus. 
The CPU always has priority, and so as long as the CPU requests access to the bus, 
any pending burst transfer must wait. The CPU requests bus access when it executes 
an instruction that writes or reads data to
SRAM, I/O memory, EEPROM or the external bus interface.


Wenn dein Programm sehr viel im SRAM macht, dann kommt der DMA 
Controller auch seltener dran. Hast du da eine ungeschickte 
Warteschleife implementiert?

von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

Nein, ich habe ihn dauaerhaft in den IDLE-state gelegt. -> Power-down

von Timmo H. (masterfx)


Lesenswert?

Also ich komme auf etwa 6 Msp ohne Double Buffering von internen SRAM 
(256 Byte Transaction) auf einen Port bei 32 MHz FCPU

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.