Forum: PC-Programmierung C# Kritische Abschnitte


von Mario G. (suicided)


Lesenswert?

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

von besucher (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von __tom (Gast)


Lesenswert?

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

von Mario G. (suicided)


Lesenswert?

"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.

von Markus V. (valvestino)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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.

von Mario G. (suicided)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von Mario G. (suicided)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?


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.