Forum: Mikrocontroller und Digitale Elektronik [STM32] SPI über DMA lohnenswert?


von G. P. (gpnt)


Lesenswert?

Guten Tag,
Ich habe ein STM32F429-Discovery Board, an dem über SPI ein LIS3DH 
Beschleunigungssensor von ST angeschlossen ist.
Mittels einem Timer Interrupt, der alle 200µs auslöst, wird der aktuelle 
Beschleunigungswert für alle drei Achsen periodisch abgefragt und in ein 
3*2048Byte Array gespeichert.
Da 200µs eine recht knappe Zeitspanne ist, ist der Prozessor 
dementsprechend auch ausgelastet. Nun muss der Prozessor noch das 
Display auf dem Board ansteuern, die gemessenen Daten verarbeiten und in 
Zukunft noch Werte von am besten 2-3 weiteren Sensoren einlesen können.

Jetzt zu meiner Frage: Wäre es in dem Fall bezüglich der 
Prozessorauslastung von Vorteil, wenn man den SPI über DMA laufen lässt 
oder bringt das in diesem Fall nichts, weil anstatt großer Datenmengen 
immer nur 16Bit auf einmal hin- und her geschickt werden?

von Alain S. (alain_s)


Lesenswert?

Gianluca P. schrieb:
> Da 200µs eine recht knappe Zeitspanne ist, ist der Prozessor
> dementsprechend auch ausgelastet.

Dann machst du irgendwas falsch wenn der bei so ner Lappalie bereits 
ausgelastet ist. 200us sind ne halbe Ewigkeit für das Ding.
Wie hoch ist der SPI-Takt?
DMA bringt sicher etwas - du musst nicht warten bis die Übertragung 
abgeschlossen ist.

von G. P. (gpnt)


Lesenswert?

Das "ausgelastet" war auch eher relativ gemeint mit dem Hinblick, dass 
das Teil in Zukunft mehrere Sensoren abtasten soll und der Prozessor 
nebenbei auch noch zu schaffen hat.
Ich hatte mal gelesen, dass der erst dann DMA von Vorteil ist, wenn 
große Datenmengen auf einmal übertragen werden, bsp. beim Speichern auf 
SD-Karte o.ä., deswegen die Frage.
Der APB1 Takt müsste bei 42MHz liegen, mit einem Prescaler von 8 wäre 
ich dann bei 5,25MHz...

von dofgih (Gast)


Lesenswert?

>Ich hatte mal gelesen, dass der erst dann DMA von Vorteil ist, wenn
>große Datenmengen auf einmal übertragen werden, bsp. beim Speichern auf
>SD-Karte o.ä., deswegen die Frage.

Du solltest den Aufwand, einen DMA-Transfer aufzusetzen mit dem
Aufwand, einen Wert vom/zum SPI zu transferieren vergleichen.

Wenn Du beispielsweise zur Programmierung pro Transfer 20 Bytes in den 
DMA Controller
schreiben musst im Vergleich zu einem oder mehreren Bytes  aus dem SPI 
Datenregister zu lesen, ist das ein Minusgeschäft.

Aber wie immer kommt es auf den Einzelfall an...
Man kann das mit dem DMA mehr oder weniger geschickt machen.

von aSma>> (Gast)


Lesenswert?

Gianluca P. schrieb:
> Guten Tag,
> Ich habe ein STM32F429-Discovery Board, an dem über SPI ein LIS3DH
> Beschleunigungssensor von ST angeschlossen ist.
> Mittels einem Timer Interrupt, der alle 200µs auslöst, wird der aktuelle
> Beschleunigungswert für alle drei Achsen periodisch abgefragt und in ein
> 3*2048Byte Array gespeichert.
> Da 200µs eine recht knappe Zeitspanne ist, ist der Prozessor
> dementsprechend auch ausgelastet. Nun muss der Prozessor noch das
> Display auf dem Board ansteuern, die gemessenen Daten verarbeiten und in
> Zukunft noch Werte von am besten 2-3 weiteren Sensoren einlesen können.
>
> Jetzt zu meiner Frage: Wäre es in dem Fall bezüglich der
> Prozessorauslastung von Vorteil, wenn man den SPI über DMA laufen lässt
> oder bringt das in diesem Fall nichts, weil anstatt großer Datenmengen
> immer nur 16Bit auf einmal hin- und her geschickt werden?

Für dich ist es ganz klar die DMA muss sein. Du hast ja keine 2 bis 3 
bytes sondern 3*2048Byte array. Die DMA auch am besten triggern oder 
manuell starten, da sonst der BUS zu ist.

Ich benutze am µC immer die DMA, solange die errata es zulässt! Auch 
wenn ich, z.B am i2c bus immer warten muss.

Beim stm32 kann man sogar die GPIO´s mit DMA befeuern. Leider aber nur 
die komplette Bank (GPIOx).

200µs erscheinen mir etwas zu schnell abgetastet zu sein. Fast bei allen 
instabilen Strecken, die ich jetzt geregelt habe, reichen 1-20ms dicke 
aus.

Ich kenne jetzt dein Projekt nicht genau. Aber du musst versuchen den µC 
"Echtzeit" beizubrigen. Dabei gehst du alle TASK durch die du hast z.B:
-0,2ms für LIS3DH
-3ms LCD
-0,2ms weitere Aufgaben
macht zusammen ca. 5ms. Erstellst einen sysTick timer interrupt, der 
jede ms eine volatile var summiert und bei 5ms eine volatile bool var = 
true setzt...

mfg

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

dofgih schrieb:
> Aber wie immer kommt es auf den Einzelfall an...
> Man kann das mit dem DMA mehr oder weniger geschickt machen.
Ganz genau so seh ich das auch.

Ich führe mir auch immer vor Augen, ob die CPU im Einzelfall warten 
muss. Ist dies der Fall, nehme ich den DMA.

von Clemens L. (c_l)


Lesenswert?

Benutzt du überhaupt den SPI-Interrupt?

von G. P. (gpnt)


Lesenswert?

aSma>> schrieb:

> Für dich ist es ganz klar die DMA muss sein. Du hast ja keine 2 bis 3
> bytes sondern 3*2048Byte array. Die DMA auch am besten triggern oder
> manuell starten, da sonst der BUS zu ist.

Hm, ich frage die 3*2048Byte ja nicht auf einmal ab, sondern es werden 
alle 200µs 3 Register über den SPI ausgelesen, wo dann jedes mal 1 Byte 
zurück kommt. Sprich 3 mal hintereinander das:
1
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
2
SPI_I2S_SendData(SPI2, wert);
3
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
4
ret_wert=SPI_I2S_ReceiveData(SPI2);

So wie ich das jetzt verstanden habe, kann man bei der Verwendung des 
DMA
auf das
1
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
verzichten und währenddessen das restliche Programm laufen lassen. 
Richtig?

Kann man auch alle 3 Register-Adressen, die abgefragt werden in den 
DMA-TX-Buffer schreiben und bekommt dann die 3 gewünschten Werte im 
RX-Buffer zurück?
Oder um es mal anders zu formulieren:
Ich verstehe das Prinzip dahinter noch nicht zu 100%. Werden zuerst alle 
Bytes vom TX-Buffer direkt hintereinander gesendet und dann alle Bytes 
für den RX-Buffer empfangen oder wird zuerst das erste Byte vom 
TX-Buffer versendet, daraufhin das erste Byte empfangen, danach das 
zweite Byte versendet und das zweite empfangen usw.?

> 200µs erscheinen mir etwas zu schnell abgetastet zu sein. Fast bei allen
> instabilen Strecken, die ich jetzt geregelt habe, reichen 1-20ms dicke
> aus.
200µs, also 5kHz muss es nicht sein, 2kHz würden theoretisch schon 
genügen.
Es geht darum, Vibrationen zu messen.

Clemens L. schrieb:
> Benutzt du überhaupt den SPI-Interrupt?
Nein, ich arbeite (noch) ohne SPI-Interrupt.

von Martin K. (martinko)


Lesenswert?

Hi,

Also beim SPI den Interrupt verwenden wäre schon einmal von Vorteil, 
dann brauchst Du die (busy-) Warteschleife nicht mehr und kannst Dein 
Programm darüber informieren lassen wenn die Daten da sind.
Zum anderen: Der DMA wird bei Dir wahrscheinlich Sinn machen, da Du den 
SPI nur mit 5.25MHz betreibst. Den DMA Kontroller für einen Transfer 
aufsetzen (Adressen setzen, Bytes setzen, go) kannst Du aber mit 
"fullspeed".
Zum dritten, für die Speed Fans (wobei das bei dieser Geschwindigkeit 
keinen Sinn mehr macht) hat der STM32 verschiedene Speicherbereiche, so 
dass man DMA Puffer für die Blockweise Übertragung auch so legen kann, 
dass kein Konflikt beim Speicherzugriff mit der CPU mehr auftritt.

Gruß
Martin

von Frickelfritze (Gast)


Lesenswert?

Gianluca P. schrieb:
> und währenddessen das restliche Programm laufen lassen.
> Richtig?

Wie soll bitte "das restliche Programm" weiterlaufen wenn
DMA läuft? Haben die STMs zwei unabhängige Busse? Für meine
Begriffe steht der Prozessor solange DMA läuft da der
Datenaustausch vom Speicher mit der SPI Maschine stattfindet.
Allerhöchstens könnte Code im Flash abgearbeitet werden der
keinen Zugriff auf das RAM erfordert.

Der zeitliche Gewinn mit DMA gegenüber programmierten I/O
ist nur dass weniger Register Handshake ausgeübt wird (was
natürlich bei grösseren Datenmengen immer mehr ins Gewicht
fällt).

von Falk B. (falk)


Lesenswert?

@  Gianluca P. (gpnt)

>Hm, ich frage die 3*2048Byte ja nicht auf einmal ab, sondern es werden
>alle 200µs 3 Register über den SPI ausgelesen, wo dann jedes mal 1 Byte
>zurück kommt. Sprich 3 mal hintereinander das:

Schon klar.

>while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
>SPI_I2S_SendData(SPI2, wert);
>while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
>ret_wert=SPI_I2S_ReceiveData(SPI2);

Das dauert gerade mal so lange, wie deine SPI die Daten transportiert. 
Bei 8 MHz sind gerade mal 6us.

>So wie ich das jetzt verstanden habe, kann man bei der Verwendung des
>DMA auf das

>while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);

>verzichten und währenddessen das restliche Programm laufen lassen.
>Richtig?

Ja. Kann man machen, lohnt sich aber kaum. Ausserdem kannst du die 
Ergebnisse erst im nächsten Timerinterrupt weiterverarbeiten.

>Kann man auch alle 3 Register-Adressen, die abgefragt werden in den
>DMA-TX-Buffer schreiben und bekommt dann die 3 gewünschten Werte im
>RX-Buffer zurück?

Nein, sooo einfach ist es nicht. DMA ist relativ dumm, dass kann nur 
Blöcke von Daten von A nach B kopieren. DU musst aber für deinen Tranfer 
von einem Byte
zuerst ein Steuerbyte senden und dann ein Dummy-Byte, wobei der dabei 
empfangene Wert deine gesuchten Daten sind. OK, das ist noch einfach, 
das kann DMA auch, WENN man zwischendurch nicht das CS-Signal deines 
SPI-Baustein umschalten muss.

>Ich verstehe das Prinzip dahinter noch nicht zu 100%. Werden zuerst alle
>Bytes vom TX-Buffer direkt hintereinander gesendet und dann alle Bytes
>für den RX-Buffer empfangen

Nein, das passier bei SPI immer parallel!

>oder wird zuerst das erste Byte vom
>TX-Buffer versendet, daraufhin das erste Byte empfangen, danach das
>zweite Byte versendet und das zweite empfangen usw.?

Fast. Mit jedem Takt der SPI wird ein Bit gesendet und gleichzeitig eins 
empfangen. Nach 8 Takten ist das erste Byte gesendet und auch das 1. 
Byte empfangen worden.

>> Benutzt du überhaupt den SPI-Interrupt?
>Nein, ich arbeite (noch) ohne SPI-Interrupt.

SPI wird in den meisten Fällen relativ schnell getaktet, sodaß es sich 
kaum lohnt, dort mit Intrrupts zu arbeiten. Nur wenn das Verhältnis von 
CPU-Takt zu SPI-Takt sehr hoch wird, lohnt sich das wieder. Ich sag mal 
wenn deine CPU nicht 10x schneller als den SPI getaktet ist, lohnt sich 
ein Interrupt nicht. Denn der braucht auch Zeit zum Anspringen und 
Rückspringen und Register sichern. Je größer die CPU (dicker 32 Bitter), 
umso mehr Takte werden dafür benötigt.

von Falk B. (falk)


Lesenswert?

@Frickelfritze (Gast)

>> und währenddessen das restliche Programm laufen lassen.
>> Richtig?

>Wie soll bitte "das restliche Programm" weiterlaufen wenn
>DMA läuft?

Ganz normal.

>Haben die STMs zwei unabhängige Busse?

Haben sie. Und eine schöne Schaltmatrix für alle Busteilnehmer.

> Für meine
>Begriffe steht der Prozessor solange DMA läuft da der
>Datenaustausch vom Speicher mit der SPI Maschine stattfindet.

Irrtum. Das würde das ganze Konzept von DMA (<- anclicken!) ad 
absurdum führen.

>Allerhöchstens könnte Code im Flash abgearbeitet werden der
>keinen Zugriff auf das RAM erfordert.

Nö. Schau mal in ein Datenblatt eines STM32, der F0 reicht, selbst der 
hat die Busmatrix und 5 DMS-Kanäle.

>Der zeitliche Gewinn mit DMA gegenüber programmierten I/O
>ist nur dass weniger Register Handshake ausgeübt wird (was
>natürlich bei grösseren Datenmengen immer mehr ins Gewicht
>fällt).

Falsch.

von G. P. (gpnt)


Lesenswert?

Frickelfritze schrieb:
> Wie soll bitte "das restliche Programm" weiterlaufen wenn
> DMA läuft? Haben die STMs zwei unabhängige Busse?
Ja genau DAS weiß ich ja nicht.

Falk B. schrieb:
> Das dauert gerade mal so lange, wie deine SPI die Daten transportiert.
> Bei 8 MHz sind gerade mal 6us.
Okay, ich glaube nach deinem Post habe ich das mit dem SPI wirklich 
verstanden. Danke.
Wenn das wirklich nur 6µs sind, dann lohnt sich das mit dem DMA oder 
SPI-Interrupt wahrscheinlich eher weniger

von Frickelfritze (Gast)


Lesenswert?

Falk B. schrieb:
> Irrtum. Das würde das ganze Konzept von DMA (<- anclicken!) ad
> absurdum führen.

Dann erklär mal bitte wie die DMA Maschine lesend auf das RAM
zugreifen kann während der Prozessor schreibend auf das gleiche
RAM zugreift. Da hilft keine Busmatrix. Vielleicht noch ein
Cache wenn gerade die richtigen Daten an der richtigen Stelle
"gepuffert" werden.

von aSma>> (Gast)


Lesenswert?

Gianluca P. schrieb:
> Kann man auch alle 3 Register-Adressen, die abgefragt werden in den
> DMA-TX-Buffer schreiben und bekommt dann die 3 gewünschten Werte im
> RX-Buffer zurück?
> Oder um es mal anders zu formulieren:
> Ich verstehe das Prinzip dahinter noch nicht zu 100%. Werden zuerst alle
> Bytes vom TX-Buffer direkt hintereinander gesendet und dann alle Bytes
> für den RX-Buffer empfangen oder wird zuerst das erste Byte vom
> TX-Buffer versendet, daraufhin das erste Byte empfangen, danach das
> zweite Byte versendet und das zweite empfangen usw.?

Ja, du willst also das wir für dich die Datenblätter lesen...
Du musst dein Bussystem verstehen. Wie man es anspricht usw. 
Normalerweise ist es gewünscht so vorzugehen.

>Es geht darum, Vibrationen zu messen.
Gut zu wissen, was du vorhast. Jetzt kann man dir Helfen.

Mit einen Beschleunigungsmesser (LIS3DH)? Dazu brauchst du ein Mikrofon. 
Habe ich auch schon mal mittels FFT (Fourier-Reihe) gemacht.

Du musst nur bedenken, wenn man 20Hz misst, das sind dann 50ms. Und wie 
du schon sagst 1khz und drüber sind kaum Vibrationen wahrnehmbar. Du 
brauchst halt das Nyquist Theorem. Jetzt verstehe ich auch warum du so 
ein großes Array brauchst.

Aufjedenfall kannst du mittels einen Timerinterupt die SPI starten 
(DMA_TX). In der Interupt routine triggerst du dein ADC Modul oder halt 
die den SPI Bus. Wenn dein DMA Array voll ist, dann startet ein DMA_RX 
Intrupt. Natürlich kann man auch die DMA Daten in ein anderes Array 
kopieren. Ich kenne die Datenblätter nicht von LIS3DH.

Diese Methode hat den riesen Vorteil, dass du kaum auf die Daten warten 
musst, sondern in der Interupt Routine alles schnell erledigt wird. Die 
Abtastzeit von dir wird immer eingehalten!!!

Nichtsdestotrotz, du musst ein wenig Kopfrechnen:
5Mhz und 6000bytes macht 1.2ms, lcd ansprechen macht ca. 3ms (k.A. nur 
angenommen). Wenn es dir ausreichend erscheint, dann lasse die DMA weg 
und mache das mit normalen Interrupt. Nicht zu vergesen ist, dass 
während du den Bildschirm anspricht, dann wird nicht gemessen und 
ausgewertet. Denke drüber nach.

Wie gesagt:
>Aber du musst versuchen den µC "Echtzeit" beizubrigen.

Versuche das zu verstehen und umzuseten!!! Wenn du sagst 2khz ist deine 
Abtastzeit, dann versuche das umzusetzten. Leider braucht: printf oder 
lcd Ausgabe immer am meisten Zeit. Du musst alles durch interrupts 
hinkriegen. Deinen SPI Bus takt musst du erhöhen. Oder du versuchst es 
erstmal mit 500hz usw.

mfg

von Falk B. (falk)


Lesenswert?

@  Frickelfritze (Gast)

>> Irrtum. Das würde das ganze Konzept von DMA (<- anclicken!) ad
>> absurdum führen.

>Dann erklär mal bitte wie die DMA Maschine lesend auf das RAM
>zugreifen kann während der Prozessor schreibend auf das gleiche
>RAM zugreift. Da hilft keine Busmatrix.

Aber sicher. Die beiden Zugriffe werden zeitlich versetzt ausgeführt. In 
welcher Reihenfolge und Priorität ist eine andere Frage, da gibt es 
verschiedene Lösungen.
Die CPU wird sicher NICHT dauerhaft ohne Pause auf den RAM zugreifen und 
diesen blockieren. Zumal CPU-Zugriffe meist die niedrigste Priorität 
haben ;-)

> Vielleicht noch ein
>Cache wenn gerade die richtigen Daten an der richtigen Stelle
>"gepuffert" werden.

Schon mal richtig. Die DMA hat auch einen Cache, mal größer, mal 
kleiner, um Zugriffe bzw. Wartezeiten der Busmatrix ausgleichen zu 
können.

von aSma>> (Gast)


Lesenswert?

Sry, Schwachsinn. Bei 20Hz Frequenz hast man 50ms und bei 10Hz 0,1 ms. 
Das ist deine Echtzeit Periode: nämlich z.B. 0,1ms. In dieser Zeit musst 
du alle z.B. 1khz werde Abtasten, verarbeiten, ausgeben (EVA Prinzip).

mfg

von Frickelfritze (Gast)


Lesenswert?

Falk B. schrieb:
> Die CPU wird sicher NICHT dauerhaft ohne Pause auf den RAM zugreifen und
> diesen blockieren. Zumal CPU-Zugriffe meist die niedrigste Priorität
> haben ;-)

Da hätte ich mal geschätzt dass die DMA Maschine - wenn SPI bedient
werden soll - eb bloc das RAM sperrt bzw für freien Zugriff behindert
solange bis der SPI Transfer beendet ist. Das meine ich mit nicht
gleichzeitig. Dass ein gewisses Interleaving stattfinden mag das kann
sein, ist aber dann effektiv (vom Zeitgewinn/verlust) das Gleiche
als wenn ich DMA und Prozessorzugriff blockweise nacheinander ausführe.

Das bedeuted für mich dass ein "Gleichzeitig" im Sinne von Zeitgewinn
und Performance-Verbesserung nicht stattfindet da eben doch nicht
zwei "Leute" wirklich gleichzeitig an einer Datenquelle arbeiten könen.

von aSma>> (Gast)


Angehängte Dateien:

Lesenswert?

Servus,
hier sieht man die Vorteile von DMA+Interupt:
http://letanphuc.net/2014/06/stm32-mpu6050-dma-i2c/

mfg

von G. P. (gpnt)


Lesenswert?

aSma>> schrieb:
> Ja, du willst also das wir für dich die Datenblätter lesen...
> Du musst dein Bussystem verstehen. Wie man es anspricht usw.
> Normalerweise ist es gewünscht so vorzugehen.
Nö, hat sich nur angeboten kurz nachzufragen, da ich eh schon nen Thread 
eröffnet habe. Muss ja keiner Antworten ;)

> Mit einen Beschleunigungsmesser (LIS3DH)? Dazu brauchst du ein Mikrofon.
Bitte keine Diskussion über das Wie und Warum. Das hat schon seine 
Richtigkeit mit dem Sensor. Man muss auch hier immer den Einzelfall 
betrachten und das wurde alles bereits getan.

von Falk B. (falk)


Lesenswert?

@  Frickelfritze (Gast)

>> Die CPU wird sicher NICHT dauerhaft ohne Pause auf den RAM zugreifen und
>> diesen blockieren. Zumal CPU-Zugriffe meist die niedrigste Priorität
>> haben ;-)

>Da hätte ich mal geschätzt dass die DMA Maschine - wenn SPI bedient
>werden soll - eb bloc das RAM sperrt bzw für freien Zugriff behindert
>solange bis der SPI Transfer beendet ist.

Das tut sie nicht. DMA holt sich ein-N Bytes (Burstlänge) und schaufelt 
die dann je nach Geschwindigkeit des Ziels raus.
Also wird der RAM nur für N Takte/Zugriffe blockiert.

> Das meine ich mit nicht
>gleichzeitig. Dass ein gewisses Interleaving stattfinden mag das kann
>sein, ist aber dann effektiv (vom Zeitgewinn/verlust) das Gleiche
>als wenn ich DMA und Prozessorzugriff blockweise nacheinander ausführe.

Nö, es gibt einen deutlichen Zeitgewinn, vor allem bei hohen 
Datenvolumen.

>Das bedeuted für mich dass ein "Gleichzeitig" im Sinne von Zeitgewinn
>und Performance-Verbesserung nicht stattfindet da eben doch nicht
>zwei "Leute" wirklich gleichzeitig an einer Datenquelle arbeiten könen.

Doch, das tun sie. Eben weil der Bus zum Speicher effektiv mehr 
Bandbreite hat als sie die CPU im Normalfall benötigt.
Und selbst wenn es nicht so wäre, kann DMA Daten schneller kopieren als 
die meisten einfachen/mittleren CPUs, die keinen Cache haben.
Das war schon zu seeligen Amiga-Zeiten so (der Blitter läßt grüßen).

von Stefan K. (stefan64)


Lesenswert?

Frickelfritze schrieb:
> Dann erklär mal bitte wie die DMA Maschine lesend auf das RAM
> zugreifen kann während der Prozessor schreibend auf das gleiche
> RAM zugreift.

Wenn so etwas passiert, dann ist das ein Software-Design-Error. Denn das 
Ergebnis ist undefiniert, je nachdem, wer von beiden der erste ist.

Natürlich spart ein DMA-Zugriff CPU-Zeit, denn die Alternativen sind 
Polling oder ein Interrupt nach jedem Datentransfer. Beim DMA fällt 
dagegen nur CPU-Zeit für das Starten des DMA und das Notify an, der 
Zeitgewinn wird dabei mit wachsenden DMA-Datenblöcken größer.
Der DAM-Speicherzugriff bremst dagegen wie von Falk bereits gesagt die 
CPU in der Regel nicht aus, da die CPU den Datenbus i.d.R. nie 100%ig 
auslastet.

Gruß, Stefan

von Falk B. (falk)


Lesenswert?

@ aSma>> (Gast)

>hier sieht man die Vorteile von DMA+Interupt:
>http://letanphuc.net/2014/06/stm32-mpu6050-dma-i2c/

Naja, I2C ist ja nun recht lahm, da fällt der Gewinn leicht ;-)
Im Prinzip kann man sich DMA wie einen größeren FIFO am UART vorstellen. 
Man schaufelt einmal alle Daten mit maximaler CPU-Geschwindigkeit rein 
(Daten erzeugen per CPU) und die DMA + Zielmodul, hier SPI, schaufeln 
die Daten je nach Geschwindigkeit raus.
Beim Normalen UART hat man meist nur 1-2 Bytes FIFO in Hardware, durch 
DMA kann man quasi den gesamten RAM als FIFO nutzen. Und der 
Datentransfer läuft ohne CPU Arbeit und je nach Prozessor und 
DMA-Anwendung wird die CPU dadurch nicht nennenswert verlangsamt.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

aSma>> schrieb:
> Mit einen Beschleunigungsmesser (LIS3DH)? Dazu brauchst du ein Mikrofon.
Und falls du Sänger bist, brauchst du einen Beschleunigungssensor!

von aSma>> (Gast)


Lesenswert?

Reginald L. schrieb:
> aSma>> schrieb:
>> Mit einen Beschleunigungsmesser (LIS3DH)? Dazu brauchst du ein Mikrofon.
> Und falls du Sänger bist, brauchst du einen Beschleunigungssensor!

Lasse mich gerne Aufklären mit den Beschleunigungssensor. Wie man damit 
singen kann.

Gianluca P. schrieb:
> Bitte keine Diskussion über das Wie und Warum. Das hat schon seine
> Richtigkeit mit dem Sensor. Man muss auch hier immer den Einzelfall
> betrachten und das wurde alles bereits getan.

Aber der TE will ja keine Diskussionen. Deshalb bin ich hier raus.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

aSma>> schrieb:
> Lasse mich gerne Aufklären mit den Beschleunigungssensor. Wie man damit
> singen kann.
Ja nee, du hast schon recht.

von aSma>> (Gast)


Angehängte Dateien:

Lesenswert?

@Reginald Leonczuk
Mit einen Mikrofon kann man super Vibrationen messen. Vielleicht geht es 
mit einen Beschleunigungssensor auch noch besser. K.A.

ABER ich erkenne nicht aus deinen Komentar, ob du überhaupt Wissen dazu 
hast. Vielleicht bist du nur so ne in der Mülltone singende Kakerlake.

Der TE kann machen, wie er will. Ich habe nur ein Tipp gegeben wie ich 
das mal erfolgreich gemacht habe.

Dabei sollten bei mir nur niederfrequente Frequenzen bestimmt werden. 
Hohe Frequenzen sahen noch besser aus.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

aSma>> schrieb:
> Mit einen Mikrofon kann man super Vibrationen messen. Vielleicht geht es
> mit einen Beschleunigungssensor auch noch besser. K.A.
Na dann mist mal weiter mit deinen Mikrofonen.

aSma>> schrieb:
> ABER ich erkenne nicht aus deinen Komentar, ob du überhaupt Wissen dazu
> hast.
Ich hab schon so ziemlich mit allem Vibrationen gemessen. Mit 
Lautsprechern, Piezopiepsern, billigen und teuren Mems-Sensoren und 
Industrie-Beschleunigungsaufnehmern.

aSma>> schrieb:
> Vielleicht bist du nur so ne in der Mülltone singende Kakerlake.
...Mülltonne schreibt man mit zwei n's.

von aSma>> (Gast)


Lesenswert?

Reginald L. schrieb:
>> Vielleicht bist du nur so ne in der Mülltone singende Kakerlake.
> ...Mülltonne schreibt man mit zwei n's.

Aber Kakerlake habe ich richtig geschrieben?! :D

von MCUA (Gast)


Lesenswert?

Bei DMA-Betrieb ist es norm. so, dass (wegen mögl. Buskonflikt) die CPU 
einige Takte (durchgängig oder in Intervallen (bsp Cycle-Stealing)) 
aussetzt.
Nur wenn der betr. Speicherbereich Mehrere Busse hat (bsp X- u Y-Bus bei 
DSPs oder versch. Controllern), ist (fast) völlig paralleles Arbeiten 
möglich.

von MCUA (Gast)


Lesenswert?

>Im Prinzip kann man sich DMA wie einen größeren FIFO am UART vorstellen.
Nein. DMA u. CPU benötigen zur Funktion einen Bus, FIFO nicht.

von Falk B. (falk)


Lesenswert?

@MCUA (Gast)

>>Im Prinzip kann man sich DMA wie einen größeren FIFO am UART vorstellen.

>Nein. DMA u. CPU benötigen zur Funktion einen Bus, FIFO nicht.

[ ] Du hast die Bedeutung des Wortes "Prinzip" verstanden.

von MCUA (Gast)


Lesenswert?

>Du hast die Bedeutung des Wortes "Prinzip" verstanden.
Eben.
DMA u. FIFO arbeiten 'prinzipiell' anders.

von PG-Format nur für Fotos und Scans verwenden! Zeic (Gast)


Lesenswert?

>DMA u. FIFO arbeiten 'prinzipiell' anders.

Anders als was?

von Peter D. (peda)


Lesenswert?

Schau mal ins Datenblatt des MCs, ob das SPI nicht schon selber einen 
Puffer hat. Manche SPI haben bis zu 16 Byte/Word Puffer. Dann kann man 
einfach im Timerinterrupt den Puffer lesen und das nächste Lesen 
starten.

von Vincent H. (vinci)


Lesenswert?

Ich würde die Verwendung des DMAs davon abhängig machen wie oft die 
Auswertung der Daten erfolgt oder anders gesagt, in welchem 
Frequenzbereich sich die Vibrationen bewegen.

Nur wenn man nicht alle 5kHz messen muss heißt das noch lange nicht, 
dass man es nicht kann. Wozu die zusätzliche Information verschenken? 
Wegschmeißen kann man sie notfalls immer noch, wenns mal im Speicher 
liegt...

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.