PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Umstieg ATXMEGA - STM32F4 DMA-SPI-Optimeirung zum Auslesen eines ADCs



erik_wolfram
06.08.2015, 23:10
Hallo,
seid geraumer Zeit bin ich nun auf einen STM32 umgestiegen, nachdem ich einen ATXMEGA maximal ausgereizt habe.
Mit dem ATXMEGA (32 MHz) habe ich zwei 16-Bit ADCs mit 200 kHz erfolgreich ausgelesen. Damit war ich an der absoluten Obergrenze.

Nun möchte ich das gleiche (angepasste) Programm auf den STM übertragen. Timer, SPI und DMA bekomme ich zum laufen, aber durch die erhöhten Anforderungen (meinerseits) komme ich schon wieder an Grenzen.
Nun möchte ich die gleichen zwei ADC's (Daisy-Chain) mit 400 kHz auslesen können!

Zum Ablauf:
Ein PWM-Signal erzeugt mit das Start-Signal CONVST für eine einzelne ADC-Wandlung. 1,4 µs später kann der ADC mittels SPI (4 Dummy-Bytes = 2 x 16 Bit) angesprochen werden und gibt seine Daten simultan aus. (Die MOSI-Leitung wird nicht verwendet - die Ausgabe dient lediglich dem Erzeugen des SCK-Taktes). Ein weiterer DMA-Kanal speichert mit die empfangenen Daten.

Auf dem ATXMEGA konnte ich denvollständigen Ausleseprozess mittels DMA, Event-Manager und SPI ohne zusätzliche Rechenleitsung umsetzten.
Leider fehlt mir bei der Umsetzung auf den STM32 das Event-System und ich suche nach Alternativen.

Mein bisheriger Ansatz für den STM:
Ein Timer generiert mir einen 2,5 µs-Takt der per Interrupt den DMA auslöst. Dieser DMA "füttert" mir den SPI mit 4 Bytes mit voller Geschwindigkeit (keine Verzögerung zwischen den einzelnen Bytes). Nach der Beendigung der Übertragung Deaktiviert mir das DMA-Interrupt den entsprechenden DMA. Beim nächsten Takt des Timers wird der DMA wieder aktiviert und überträgt wieder 4 Bytes.
Mit dem Auslesen des SPIs habe ich mich noch nicht näher beschäftigt, hier vermute ich aber keine Probleme.
Leider hat diese Lösung aber ein Problem: das Interrupt des Timers hat eine Latenz von ca. 480 ns mit denen ich nicht leben kann (woher sie kommen ist mir klar).
Nun möchte ich das umgehen. Ich habe versuch mit "Gewalt" das Enable-Flag mit einem weiteren DMA zu setzten um das Timer-Interrupt zu umgehen - leider zeigt das keine Wirkung! Gibt es auf dem STM etwas vergleichbares wie das Event-System von Atmel? Ich bin leider nicht fündig geworden...

Ich möchte hier nicht explizit auf den Code eingehen sondern einen Ansatz finden. Daher poste ich hier auch nicht den bisherigen Code.
Das Problem sollte (?!) auch ohne Code disskutierbar sein.

Ich danke für die Hilfe!

Gruß Erik

schorsch_76
08.08.2015, 09:06
Etwas offtopic, aber um ein Bild zu bekommen ...

Ich kann dir sagen, dass aktuelle High Performance Rechner mit Echtzeitkernel eine Latenz von 10-80 µs haben [5]. Die beiden Videos auf Youtube lohnen sich :)


[1] http://www.lug-erding.de/vortrag/Linux_Echtzeit-01-Einfuehrung.pdf
[2] https://www.linutronix.de/index.php?page=echtzeit
[3] https://www.youtube.com/watch?v=n9ucTGWrON8 (Inside the RT Patch)
[4] http://events.linuxfoundation.org/sites/events/files/slides/cyclictest.pdf
[5] https://youtu.be/f_u4r6ehZKY?t=21m57s

oberallgeier
08.08.2015, 10:32
... dass aktuelle High Performance Rechner mit Echtzeitkernel eine Latenz von 10-80 µs haben [5] ...Nu sind einerseits selbst 10 µs wirklich eine s..kurze Zeit - da fällt ein losgelassener Stein auf der Erdoberfläche grad mal 500 pm (Pikometer) das sind 0,5 nm (Nanometer). Allerdings machen meine popeligen Achtbitter mit den bei mir üblichen 20 MHz in dieser Zeit schon mal 200 Maschinenzyklen - genug Zeit, um nach dem Interrupt Daten und Adressen auf den Stack zu bringen und bereits in der ISR rumzuwerkeln - oder, bestenfalls - den RETI schon hinter sich zu haben.

schorsch_76
08.08.2015, 19:39
Na das Problem ist nicht das die CPU genug Zyklen macht, sondern häufig Cache Misses (instruction and data cache), Memory ist mittlerweile der Flaschenhals. Das Eventsystem des Atxmega, das dann die Dinge ohne Programmaufwand macht, läst das alles eben in Hardware.

Die Frage ist um auf das Hauptthema zurück zu kommen, kann man das Sampeln jenseits der 400 kHz auf einem FPGA machen und die Daten per DMA in den Speicher schreiben wo sie dann ein Prozessor abholt?

erik_wolfram
09.08.2015, 09:22
Hallo,
ich denke /hoffe, dass ich die Aufgabe mit dem STM32 bewältigen kann. Einen FPGA oder andere zusätzliche externe Hardware möchte ich umgehen. Lieber schraube ich da an der Abtastrate.

Momentan gucke ich mir die Latenzen für das Interrupt an und merke, dass da noch Potential durch die Fehler (und meine Unwissenheit) vorhanden ist. Viel lieber möchte ich die Interrupts für das wesentliche umgehen!
Für den ATXMEGA habe ich eine weile gebraucht um mir eine Strategie auszudenken, um alles über die Harware (DMA, Event-System) zu lösen. Ich hoffe der geistige Blitz für den STM kommt mir auch noch.
Ich habe mittlerweile schon vergebens versucht mit eim DMA das Enable-Flag eines anderen DMAs zu setzen. Leider hat sich da nichts getan...