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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.