Hallo zusammen,
ich habe eine kurze Frage zu einem anstehenden Projekt, zu der ich
leider bisher keine klare Antwort finden konnte und mich selber zu wenig
auskenne.
Ich würde gerne einen STM32F4 für eine zeitkritische Aufgabe benutzen,
der gleichzeitig per USB mit einem Computer kommunizieren müsste. Dabei
soll über ein Timer-Event im (schlimmsten Fall, vorhersehbar) mit
Abständen von 1us ~20 Rechenzyklen an Code ausgeführt werden.
Zwischendurch sollte jedoch immer viele Millisekunden Zeit sein um
eventuell anfallende Daten zu übertragen. Kann dieser Interrupt eine
höhere Priorität haben als der USB-Interrupt, oder stört das die
Kommunikation? Die nötige Bandbreite sind jedenfalls nur max. 100 Byte
pro Sekunde.
Ich kenne mich leider noch nicht sehr gut mit den STM32-Controllern aus,
daher wäre ich über eine kurze Antwort (falls es die gibt) dankbar, ob
das überhaupt funktionieren kann, oder ob ich die USB-Kommunikation und
die Zeitkritische Steuerung über zwei verschiedene Controller laufen
müssen.
Schöne Grüße,
GT
Den F4 soll das locker schaffen, aber sind da noch andere Wunschen, wie
gross darf der Latenz sein das die Daten uebertragen werden, muss dan
noch etwas anderes laufen (adc, uart, i2c....).
GT schrieb:> Kann dieser Interrupt eine> höhere Priorität haben als der USB-Interrupt
Ja.
GT schrieb:> der stört das die> Kommunikation?
Nein.
Bei der Enumeration gibt es bestimmte Timeouts, die genauen Werte hab
ich grad nicht parat, aber die sind in der Größenordnung vieler
Millisekunden. Für die normale Datenübertragung bei Bulk-Transfers kann
die Software praktisch beliebig lange brauchen; die Hardware hält den
Host solange "hin" bis die Software Daten geliefert hat.
Notfalls kannst du deine zeitkritische Aufgabe ja nur nach der
Enumeration beginnen.
GT schrieb:> mit> Abständen von 1us ~20 Rechenzyklen an Code ausgeführt werden
Damit sind 20 MHz schon "verbraucht". Mit Exception-Ein/Austritt könnte
das je nach CPU-Frequenz und Flash-Latenz schon eng werden...
GT schrieb:> Kann dieser Interrupt eine> höhere Priorität haben als der USB-Interrupt, oder stört das die> Kommunikation?
USB Interrupts sind i.A. überhaupt nicht zeitkritisch - denn den
zeitkritischen Teil vom USB Protokoll macht die Hardware (USB
Peripherial).
Ausnahme sind Hacks wie VUSB, weil da alles in Software gemacht wird und
so binnen µs reagiert werden muss.
GT schrieb:> Dabei> soll über ein Timer-Event im (schlimmsten Fall, vorhersehbar) mit> Abständen von 1us ~20 Rechenzyklen an Code ausgeführt werden.
Das sind verdammt wenige Zyklen - da schaut man mal besser nach ob man
das clever in Hardware lösen kann.
Vielen Dank für die Antworten =)
Wenn nur die Enumeration zeitkritisch ist, dann bin ich ja beruhigt.
Frank K. schrieb:> Warum ist die Wahl auf den STM32F4 gefallen? Mangelnde Marktübersicht?
Sicherlich. Ich habe schon wegen eines anderen Prpjekts mit einem
STM32F4-Discovery Board herumgespielt und ganz gute Erfahrungen damit
gemacht. Ich bin natürlich dankbar über alternative Vorschläge.
Ursprünglich hatte ich schon über einen FPGA nachgedacht, da die
"zeitkritische Aufgabe" lediglich eine art PWM an ca. 30 Pins ist. Da
bin ich mir aber nicht sicher, ob der Aufwand mich in FPGAs einzulernen
sich lohnt.
GT schrieb:> da die> "zeitkritische Aufgabe" lediglich eine art PWM an ca. 30 Pins ist.
Die STM32 können mit den Timern und deren Synchronisation und DMA
ziemlich komplexe Signalformen automatisch in Hardware erzeugen. Andere
Controller können das auch noch besser. Vielleicht lässt sich damit
deine Aufgabe lösen, wäre besser als in Software.
GT schrieb:> da die> "zeitkritische Aufgabe" lediglich eine art PWM an ca. 30 Pins ist.
Je nachdem wieviel Jitter erlaubt ist kannste das durchaus mit Software
(Timer IRQ Handler) machen.
Man muss nur daran denken dass auch ein IRQ mit allerhöchster Prio ein
Tail-Chaining machen darf, und so weniger Take als üblich benötigt.
Viele GPIOs kann man mit Timer+DMA ansteuern (Timer triggert DMA, DMA
schreibt GPIOx->BSRR). Da hat man wesentlich weniger Jitter und CPU
Last, braucht aber RAM fürs DMA.
Bei >16 Pins braucht man IMHO mindestens 2 DMA Channels, denn die GPIO
Register beim STM32 fassen nur jeweils 16 Pins zusammen.
Zeitkritisches Zeug auf dem Controller, aber der PC nur zur Kontrolle,
Parametrisierung und Visualisierung. Der zeitkritische Prozess muss ja
auch weiterlaufen, wenn das Kabel abgezogen ist, oder abgezogen wird.
Plane das Ganze so, dass der PC da sein kann, oder auch nicht.
Zitronen F. schrieb:> Zeitkritisches Zeug auf dem Controller, aber der PC nur zur> Kontrolle,> Parametrisierung und Visualisierung. Der zeitkritische Prozess muss ja> auch weiterlaufen, wenn das Kabel abgezogen ist, oder abgezogen wird.>> Plane das Ganze so, dass der PC da sein kann, oder auch nicht.
Genau so hatte ich es vor. =)