Forum: Mikrocontroller und Digitale Elektronik Stm32F4 DMA Memory to memory transfer


von Eugen (Gast)


Lesenswert?

Hallo Leute,

ich arbeite mit einem STM32F4-Discovery Board.
Ich habe ein Array und muss die Daten vom Beginn des Arrays in einen 
Bereich weiter hinten im selben Array kopieren. Ich habe versucht das 
über DMA zu realisieren, da ich ca. 15000 Bytes kopieren muss und den 
Prozessor für andere Aufgaben freihalten will. DMA funktioniert, wenn 
sich die Bereiche nicht überlappen. Andernfalls funktioniert es mit DMA 
nicht, weil src und dest immer inkrementiert werden und daher den 
Bereich mit den bereits kopierten Daten weiterkopieren. Wenn ich das 
ganze in einem Loop mache, in welchem ich die Daten von hinten nach 
vorne kopiere, funktioniert das einwandfrei.
Meine Frage: Gibt es eine Möglichkeit, dies auch über DMA zu 
realisieren?
Ich habe nur die Auswahl gefunden MIT increment oder OHNE inkrement, 
aber nicht mit decrement.
Oder vielleicht gibt es auch noch einen anderen Ansatz.

Vielen Dank im Voraus
Eugen

von M. N. (Gast)


Lesenswert?

Eugen schrieb:
> Meine Frage: Gibt es eine Möglichkeit, dies auch über DMA zu
> realisieren?

Ich denke, das geht nicht. Leider kann der STM32F4 auch nicht mit einem 
32 bit Offset arbeiten, sodass ein Inkrement mit -1, -2 oder -4 
programmierbar wäre.
Wenn ich mir dagegen die aktuellen Renesas µCs ansehe, die können 
beides.

Fazit: Augen auf bei der Prozessorwahl :-)

von Eugen (Gast)


Lesenswert?

Hallo M.N.

danke für deinen Beitrag und deine Bestätigung, dass dies scheinbar 
wirklich nicht geht. Eigentlich bin ich erst vom Atmel AT91SAM7X 
umgestiegen und dachte mit dem STM32F4 bestens bedient zu sein. Aber 
scheinbar hat halt jeder Hersteller seine Vor (und auch) Nachteile.

Grüsse
Eugen

von Norbert (Gast)


Lesenswert?

Würg-around:
kleinen (zB 256Byte) Buffer zusätzlich anlegen und dann per mehrfachem 
DMA  blockweise rückwärts hin- und hertransferieren.

Nachteil:
Doppelte DMA Last und ein bisschen IRQ.

Vorteil:
Immer noch besser als komplett mit CPU ;-)

von Klaus (Gast)


Lesenswert?

Eugen schrieb:
> den Prozessor für andere Aufgaben freihalten will.

viel wird der Prozessor nicht machen können, wenn der Speicher gerade 
vom DMA gebraucht wird.

MfG Klaus

von Eugen (Gast)


Lesenswert?

Danke für den Tip, hilft mir weiter, das Problem ein bisschen zu 
entschärfen.

Grüsse
Eugen

von Norbert (Gast)


Lesenswert?

Klaus schrieb:

> viel wird der Prozessor nicht machen können, wenn der Speicher gerade
> vom DMA gebraucht wird.

Getrennte Busse für Flash und RAM.
WIMRE, bleibt im schlimmsten Fall noch ca. 50% Durchsatz.

von M. N. (Gast)


Lesenswert?

Eugen schrieb:
> Eigentlich bin ich erst vom Atmel AT91SAM7X
> umgestiegen und dachte mit dem STM32F4 bestens bedient zu sein. Aber
> scheinbar hat halt jeder Hersteller seine Vor (und auch) Nachteile.

Es hängt immer davon ab, was man zu erledigen hat. Der STM32F4xx ist 
richtig schnell! Da gibt's nichts zu meckern. Aber wenn es um die 
Aufgaben geht, die man von einem Controller erwartet, fehlt immer der 
Punkt auf dem i.
Einer der Nachfolger, der STM32F439, hat immerhin schon einen 
SDRAM-Controller auf dem Chip.

An Deiner Stelle würde ich die Kopierfunktion mit Software erledigen und 
dabei uint32_t Zugriffe nehmen und den Speicher entsprechend ausrichten, 
dass jeder Zugriff auch nur einen Takt braucht.
Gut, das braucht auch seine Zeit, aber sehr viel schneller wird DMA auch 
nicht laufen.

von Eugen (Gast)


Lesenswert?

ich probier mal aus, ob die Kopierfunktion mit uint32_t Zugriffen 
schnell genug ist.

Grüsse
Eugen

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.