Forum: Mikrocontroller und Digitale Elektronik FreeRTOS - USB handling


von RTOS (Gast)


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

von Christian (Gast)


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

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.