Hallo miteinander Ich arbeite mich gerade ein wenig in die DMA-Welt ein und schon kommen die ersten Fragen: Wann macht es Sinn, einen DMA-Controller zu verwenden? Ich habe da an eine USART Kommunikation gedacht, welche keine fixen Grössen und Längen hat. Das Senden und Empfangen wäre schon viel eleganter, wenn ich den String wie beim Printf einfach "übergeben" könnte und der DMA erledigt dann den Rest. Dasselbe beim Empfangen, wobei es hier wohl etwas komplizierter sein wird, da nicht bekannt ist, wie viel vom Host gesendet wird. Für ständig gleich gross bleibende Daten-Packete ist der DMA sicher sehr gut, aber gehts auch bei variablen? Wenn ja, wie könnte man so etwas umsetzen? Besten Dank für die Antwort, MFG Patrick
DMA macht in erster linie für Schnittstellen mit mehr Durchsatz Sinn, z.B. USB und Ethernet. Dann kann die CPU nämlich derweil was besseres tun als memcpy. USART dagegen mit den üblichen 14kByte/s langweilt aktuelle CPUs eher.
aber man kann ja den DMA mit fast allen Peripherien einer CPU verbinden (ADC, DAC, CAN, SPI, I2C, I2S...) und da ist bei vielen längst nicht eine Geschwindigkeit von >1MByte/s. Ich habe bis jetzt mit kleinen 8 und 16-Biter gearbeitet, und da hätte ich mir z.T. einen DMA gewünscht, da je nach Anwenung 16-72 DMIPS nicht gerade berauschend (Regler, RS232 Stream...). Jetzt bin ich mit einem STM32F4 am experimentieren, und hier ist die Leistung vorhanden, und auch DMAs. Also frage ich mich, wieso bei den kleineren DMA's so selten sind, da sie hier ja umso praktischer wären.
Patrick B. schrieb: > Also frage ich mich, wieso bei den kleineren DMA's so selten > sind, da sie hier ja umso praktischer wären Weil man das ganze interruptgesteuert ebenso einfach und viel flexibler machen kann ohne dafür extra Silizium vorzusehen. Gerade bei kleinen CPUs hat man eh nicht viel anderes zu tun sodass die paar ms welche für den Interupt + Softwarebehandlung draufgehen keine Auswirkung hat.
Läubi .. schrieb: > Gerade bei kleinen > CPUs hat man eh nicht viel anderes zu tun sodass die paar ms welche für > den Interupt + Softwarebehandlung draufgehen keine Auswirkung hat Ich hatte einmal ein Projekt (Testadapter), der von einem Motorregler Daten via SPI empfängt, und diese dann via RS232->FT245 an den PC gesendet wurden. Hier wurden vom Regler (STM32) 12 32-Bit Variablen (Regler-Interne Werte wie p,i,d vom Stromregler, vom V-Regler und vom Positionsregler) über das SPI gesendet und das alle 1ms. Parallel mussten 4 Variablen auf 12-Bit umgerechnet (mit Faktoren versehen) werden, um eine DAC Ausgabe zu erreichen (SPI). Der Ft245 ist ebenfalls nicht einfach nur so anzusteuern... (Bitmanipulierung rundum). Das Ganze hat den 16-Bit Prozessor ziemlich schnell an die Grenze gebracht, obwohl es eigentlich nicht viel war. Der Sprung von den kleinen zu einem ARM ist dann meistens gerade etwas zu gross, so dass dann lieber auf das bekannte zurückgegriffen wird.
Gerade bei den STM32 musst du manchmal DMA verwenden, um die Peripherie sinnvoll nutzen zu können. Ein Beispiel ist das 'automatische' Abtasten mehrerer ADC Kanäle im Freilauf Modus. Im Gegensatz zu z.B. den XMegas hat hier nicht jeder ADC Kanal ein Ergebnis Register (zumindest beim STM32F1XX) und du bist gezwungen, die DMA zum Ablegen der Werte in den Speicher zu benutzen. Wenn man das ganze aber erstmal ausprobiert hat, ist es eine recht elegante Lösung. Einmal angeschubst läuft das ganze im Hintergrund und dein Programm holt sich nur noch die Werte aus dem Speicher.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.