Zeitkritische Operationen und USB auf STM32(F4)

Gast #5677694
Lesenswert?
• ▲
▼
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
Persönliche Seite
Lesenswert?
• ▲
▼
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...
Lesenswert?
• ▲
▼
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.
Lesenswert?
• ▲
▼
Warum ist die Wahl auf den STM32F4 gefallen? Mangelnde Marktübersicht?

Für so etwas wäre beispielsweise ein LPC43xx besser geeignet.

https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc4300-cortex-m4-m0:MC_1403790133078#/

Der hat einen Cortex M4 als Haupt-CPU - hier würde dann die 
USB-Kommunikation und das Datenmanagement laufen, und zusätzlich noch 
einen Cortex M0, der dann Deinen 1us-Task ausführen könnte. In dieser 
Serie gibt es sogar Versionen mit zwei M0.

fchk
Gast
Lesenswert?
• ▲
▼
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.
Lesenswert?
• ▲
▼
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.
Gast
Lesenswert?
• ▲
▼
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. =)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.