FreeRTOS - USB handling

Gast #4200878
Lesenswert?
• ▲
▼
Hallo,

ich bin gerade am Grübeln, wie man einen USB Stack am elegantesten in 
ein RTOS (im konkreten Fall "FreeRTOS") einbindet.
Der Mikrocontroller ist ein STM32. Zum Glück bietet ST da schon den 
passenden USB Stack an. (Auch wenn er etwas buggy ist).

Die USB Hardware des Mikrocontrollers liefert ja bei jedem Paket einen 
Interrupt auf den der USB Stack dann aufsetzt.

Ohne RTOS läuft also jeglicher Code, der mit USB Transaktionen zu tun 
hat, direkt im Interrupt Handler.

Da ich aber noch das RTOS laufen habe, finde ich diese Herangehensweise 
etwas kontraproduktiv, da so ein nicht unerheblicher Teil meines Codes 
außerhalb des RTOS contextes ausgeführt wird.

Etwas schöner wäre meiner Meinung nach die Alternative den kompletten 
USB Stack innerhalb eines Tasks (mit max. Priorität) zu halten. Dieser 
würde dauerhaft schlafen und auf eine Semaphore warten.  Der USB 
Interrupt Handler macht dann nichts anderes als diese Semaphore zu geben 
und des Task somit aufzurufen.

Wie wird das denn "normalerweise" gemacht.
Interessant wäre auch zu wissen, wie das in den großen Betriebssystemen 
gemacht wird. (Linux, Windows, OSX)

Grüße
Gast #4200892
Lesenswert?
• ▲
▼
Hallo,

ich habe sowas für einen NXP Controller gemacht. Im wesentlichen habe 
ich aus den USB-ISRs die Daten aus den Usb-Endpoints in eine 
Freertos-Queue geschrieben. Dann in einem separaten Task diese Queue 
ausgelesen und weiterverarbeitet. Für die Senderichtung genau andersrum. 
Aus einem Task schreibe ich Daten in eine Queue und lese die Queue in 
einer ISR aus, die aufgerufen wird, wenn der Sende -EP wieder frei ist. 
Das ist nicht besonders performant, aber einfach.

Ich habe versucht möglichst wenig in den ISRs zu machen und mache alles 
andere in Tasks.

Gruß
Christian

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.