www.mikrocontroller.net

Forum: PC-Programmierung C# Kritische Abschnitte


Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: __tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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/article... 
auftreten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.