Hallo Forum, ist es mit C# irgendwie möglich, das Betriebssystem daran zu hindern, einen Kontextwechsel durchzuführen? Am Rechner hängt ein USB-Controller, der nachgewiesenermaßen beim Datentransfer nicht unterbrochen werden darf. Das liegt vor allem an der vergefertigten Bibliothek (Bulk-Tansfer, 15 ms Polling-Intervall) die ich für den Controller verwende. Der Treiber auf der Host-Seite kommt irgendwie mit seinen Handels durcheinander, wenn er beim Datentransfer unterbrochen wird - und das passiert sporadisch auch noch auf Echtzeitpriorität. Viele Grüße mario
Mario G. schrieb: > ein USB-Controller, der nachgewiesenermaßen beim > Datentransfer nicht unterbrochen werden darf. Was heißt denn "nachgewiesenermaßen"? Wenn ein Datenstrom nicht abreißen darf, dann nimmt man Isochronen Transfer und nicht Bulk. Mario G. schrieb: > Der Treiber auf der Host-Seite kommt > irgendwie mit seinen Handels durcheinander, wenn er > beim Datentransfer unterbrochen wird - Das klingt aber mysteriös. Bist du sicher, dass das so in Ordnung ist? Softwarefehler im Treiber? Update verfügbar? Timeouts falsch konfiguriert? Ich meine, bevor du tief ins Betriebssystem eingreifst, solltest du erst mal in dieser Richtung alles abklopfen.
Mario G. schrieb: > Der Treiber auf der Host-Seite kommt > irgendwie mit seinen Handels durcheinander, wenn er beim Datentransfer > unterbrochen wird - und das passiert sporadisch auch noch auf > Echtzeitpriorität. Kann es sein das du mehre CPUs hast ( egal ob echt oder virtuell ). Wenn ja dann schalte mal eine CPU ab und teste dann. Wenn es auch noch eine AMD cpu ist dann installier dir mal von AMD den dualcore optimierer. AMD hat ein bug, jede CPU hat ihre eigene Zeit, beim switch von einer CPU auf die andere kann es bei einer Zeitberechnung zu negativen werten kommen. Ich vermute es handelt sich hierbei um eine Multithread bug in der Software oder im Treiber.
c# ist (wie jede gemanagte sprache) nicht für echtzeitanwendungen geeignet. es kann durchaus passieren das der garbage collector deine anwendung anhält um eine nursery collection durchzuführen. http://msdn.microsoft.com/en-us/library/bb384202.aspx
"Nachgewiesenermaßen" heißt, dass ich den Fehler reproduzieren kann, indem ich die Anwendung bei einem Datentransfer unterbreche. Der Fehler lautet: SI_INVALID_HANDLE Das ist natürlich alles nicht ganz in Ordnung. Es handelt sich um die USBXpress-Bibliothek von SiLabs. Die unterstützt nur Bulk-Transfer. Bei geringeren Polling-Intervallen geht das ganz gut. Da ich aber 250 kBit/s benötige wird alle 15 Millisekunden gepollt. den Treiber hab ich dabei als Hauptverdächtigen. Den gibts allerdings nur fertig von SiLabs. Ich plane auf jeden Fall in Zukunft den Controller zu ersetzen - bis dahin muss es aber so gehen. Deswegen würde ich gern erstmal das Betriebssystem daran hindern, die Transfers zu unterbrechen. Allerdings hast du mich mit den Timeouts auf eine Idee gebracht. Die sollten sicher kürzer sein, als das Polling-Intervall - was sie (noch) nicht sind. Die CPU-Affinität werde ich auch mal testen. das habe ich bis jetzt noch nicht gemacht. Es handelt sich aber um eine Intel-CPU. Ich hatte gehofft, dass man die Systemrufe irgendwie mit einem Wrapper auch in C# verfügbar machen kann. Mit dem Performancecounter in kernel32.dll geht das ja auch.
Mario G. schrieb: > Ich hatte gehofft, dass man die Systemrufe irgendwie mit einem Wrapper > auch in C# verfügbar machen kann. Mit dem Performancecounter in > kernel32.dll geht das ja auch. Klar kann man das. Und es ist sogar noch vergleichsweise einfach zu realisieren. Das Stichwort dazu lautet PInvoke. Wenn Du dazu mal bei MSDN und/oder www.CodeProject.com suchst, findest Du massenhaft Infos. Gruß Markus
Mario G. schrieb: > Die CPU-Affinität werde ich auch mal testen. das habe ich bis jetzt noch > nicht gemacht. Es handelt sich aber um eine Intel-CPU. bin nicht sicher ob das reicht, denn der Treiber läuft ja nicht im Kontex der anwendung. bei den Server versionen von windows kann man MAXCPU in der boot.ini angeben. Oder im zweifelsfall mal im BIOS schauen ob man es dort abschalten kann.
Peter schrieb: > bin nicht sicher ob das reicht, denn der Treiber läuft ja nicht im > Kontex der anwendung. bei den Server versionen von windows kann man > MAXCPU in der boot.ini angeben. Oder im zweifelsfall mal im BIOS schauen > ob man es dort abschalten kann. Guter einwand. :) Ich werde mal probieren die CPUs "hart" abzuschalten um festzustellen, ob es daran liegt. Eine Dauerlösung kann das aber nicht sein. Markus Volz schrieb: > Das Stichwort dazu lautet PInvoke. Danke! Da werd ich gleichmal nachschauen.
Mario G. schrieb: > Eine Dauerlösung kann das aber nicht sein. wenn der Treiber so ein bug hat, musst du dich an den Hersteller wenden. Wenn der nichts macht dann wird es wohl eine Dauerlösung
Naja... ich denke eher, dass die Bibliothek inkl. Treiber nicht wirklich meine Anwendung und die Art und Weise der Programmierung gemacht ist. Für das Einarbeiten in USB um sowas selbst zu machen, fehlt mir allerdings die Zeit.
Wurde schon mal statt Polling versucht das ganze asynchron zu machen? http://www.cygnal.org/ubb/Forum9/HTML/001307.html http://www.cygnal.org/ubb/Forum9/HTML/001521.html u.U. könnte auch sowas http://portal.knowledgebase.net/display/2n/articleDirect/index.asp?aid=194217&r=0.2035639 auftreten
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.