Autor Beitrag
Zumlin
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 22.12.10 15:10 
Hallo,

ich habe eine konzeptionelle Frage. Ich will mit meiner CAN-Hardware zeitlich sehr exakt CAN-Messages verschicken. Den Inhalt für die Messages und den Zeitpunkt, zu dem diese verschickt werden sollen, lese ich aus einer Datei aus und kann diese Infos also auch vor dem eigentlichen Senden "vorbereiten".

Mein Problem ist hier nun, dass ich keine Ahnung habe, wie ich einen solchen zeitlichen Ablauf in C# realisieren soll. Das ganze habe ich auch schon auf einem µC realisiert. Dort konnte ich mittels Hardware-Interrupts sehr genau zeitliche Ereignisse erzeugen. In C# hingegen habe ich keine Ahnung wie sich das Programm auf meinem oder auf einem anderen Rechner verhält. Bremsen andere Prozesse mein Programm aus? Kann ich meinem Prozess eine gewisse Priorität geben? Spielt die Rechenleistung der Hardware eine große Rolle? Ist ein zyklisches Senden im 1ms-Bereich auf einem Windowsrechner überhaupt möglich?

Danke schon mal im Voraus!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 22.12.10 17:15 
Hallo,

such mal hier im Forum nach "QueryPerformanceTimer".
U.a. diesen Beitrag gibt es dazu: www.c-sharp-forum.de/viewtopic.php?t=90208

Da Windows aber kein Echtzeit-OS ist, wirst du das nur bedingt hinbekommen (außer evtl. du schaltest andere (System-)Prozesse wie Antivirenprogramm, Indexscan etc. komplett ab).

Die normalen .NET-Timer beispielsweise haben nur eine Genauigkeit von ca. 14-15ms (unter WinNT-Systemen).

Es gibt auch noch die Funktion "GetTickCount", die ähnlich wie der "QueryPerformanceTimer" eine etwas höhere Genauigkeit (mindestens millisekundengenau) haben.

Nachtrag: die .NET-Klasse "Stopwatch" scheint wohl intern den QueryPerformanceTimer zu verwenden, s. www.mycsharp.de/wbb2...d.php?threadid=30638 (auf gfoidl kann man sich verlassen!)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.12.10 20:54 
Windows ist kein Echtzeitbetriebssystem. Dein Vorhaben ist also mit Windows nicht verlässlich umsetzbar.
Zumlin Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 23.12.10 13:19 
Das klingt ja alles gar nicht mal so gut.
Der einzige Lichtblick der mir noch bleibt ist, dass meine Hardware einen Sende(FIFO)puffer hat. Ich könnte ja theoretisch immer schon für einen Zeitraum von einer Sekunde alle Nachrichten "berechnen" und in den FIFO schieben. Dann hätte ich ja wieder 1 Sekunde Zeit für die nächste Berechnung und so weiter. Wenn die Ungenauigkeit bei der Zeitberechnung unter Windows und .Net "immer" +- 10ms beträgt - wie es in einem der obigen Links mal gesagt wurde - dann wirkt sich das natürlich auf eine Sekunde prozentual geringer aus.
Irgendwie habe ich aber den Verdacht, dass das trotzdem nicht so gut klappt ;)

Jetzt aber erst mal ein frohes Fest und nen guten Rutsch...
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Do 23.12.10 14:24 
Du könntest natürlich deinen Prozess die Priorität Realtime geben und in einer (endlos)Schleife senden.
Das sollte dein Vorhaben näherkommen. Aber Achtung dein PC könnte in der Zeit nicht mehr zu gebrauchen sein.