PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Echtzeitanwendungen unter Win 2000



dooya
14.07.05, 22:56
Wir (eine Kollegin und ich) wollen eine Software erstellen/laufen lassen, innerhalb der eine relativ genaue Zeitnahme möglich sein soll (Toleranz ca. 1 ms). Unter Linux-RT (real time) haben wir bereits etwas ähnliches und nun ist die Frage, ob man so etwas auch auf Win 2000 Systemen machen kann.

Sind unter Win 2000 real time Prozesse möglich? :???:

TheEvilForce
15.07.05, 01:41
Nimm einfach den Query Performance Counter, der taktet mit bis zu 3,3 Mhz. mit dem kannst du so genau die Zeit messen, das sollte auf jeden Fall reichen...

dooya
15.07.05, 23:39
Nimm einfach den Query Performance Counter, der taktet mit bis zu 3,3 Mhz. mit dem kannst du so genau die Zeit messen, das sollte aufjeden Fall reichen...Mmmh, danke, sagt mir aber gar nichts. :???: Kann man das Teil über normale c/c++ Anwendungen ansprechen?

TheEvilForce
16.07.05, 00:13
Ja natürlich kann man das... Dürfte auch ziemlich verbreitet sein, diesen zu nutzen, da er wohl in 99,99999% der modernen PCs vorhanden ist...

Ihr braucht nur ein paar Variablen in einer Header-Datei :


LONGLONG llFrequenz;
LONGLONG llAktuellerStand;
LONGLONG llLetzterStand;
float fVergangene Zeit

In der Quellcode-Datei könnt ihr nun folgendes aufrufen :


if (!QueryPerformanceFrequency((LARGE_INTEGER*)&llFrequenz))
{
LogSys->Log_Printline("Kein Query Performance Counter vorhanden...");
return 1;
}
QueryPerformanceCounter((LARGE_INTEGER*)&llLetzterStand);
QueryPerformanceCounter((LARGE_INTEGER*)&llAktuellerStand);

Damit ist die Initialisierung abgeschlossen...

Nun könnt ihr so, die vergangene Zeit berechnen...


QueryPerformanceCounter((LARGE_INTEGER*)&llAktuellerStand);
fVergangeneZeit = (llAktuellerStand - llLetzterStand) / llFrequenz;
llLetzterStand = llAktuellerStand;

dooya
16.07.05, 23:25
Ahh, das sieht schon etwas vertrauter aus. Vielen Dank. :)

dooya
18.07.05, 22:37
Mmhh, ich hab nun doch noch eine Frage. Die Zeitnahme ist mit Eurer Methode kein Problem, aber kann auch gewährleistet werden, dass das Program Echtzeit läuft, dass also bestimmte Ereignisse genau zum definierten Zeitpunkt passieren, bzw. genau die definierte Dauer haben? :???:

TheEvilForce
19.07.05, 01:20
Inwiefern meint ihr das? Führt das bitte ein wenig genauer aus...

dooya
19.07.05, 09:30
Stellt Euch vor Ihr sitzt vor einem Monitor und zum Zeitpunt t_0 werden zwei Striche dargestellt, die für exakt 500 ms präsentiert und dann wieder entfernt werden. Eure Aufgabe ist es bspw. unter Zeitdruck zu entscheiden, ob die Striche gleichlang oder verschieden waren und dies per Tastendruck zu signalisieren. Neben der Eurer Entscheidung ("gleich" oder "verschieden") ist weiterhin von Bedeutung, wieviel Zeit für diese Entscheidung benötigt habt (d.h., die Reaktionszeit).

Es ist hier also nicht nur wichtig die Reaktionszeit genau zu messen, sondern auch die Darbietungsdauer der Striche exakt zu steuern, da diese einen maßgeblichen Einfluß auf die Reaktionszeit hat.

(Diese Darstellung des experimentellen Ablaufes ist vereinfacht; die Darbietungsdauer der Striche ist nur eines aus einer Reihe von Ereignissen, deren exaktes Timing notwendig ist.)

TheEvilForce
19.07.05, 12:37
Ganz einfach :
Ihr arbeitet ja nicht mit den unsäglichen Windows Messages, sondern habt den Fokus, richtig?
Ihr führt beim Anzeigen des Strichs eine Variable ein und schaut danach bei jedem process(), ob 500 ms vergangen sind... Wenn ja, dann entfernt ihr den Strich, beziehungsweise zeichnet ihn nicht neu...
Die Reaktionszeit messt ihr ja per Tastendruck, nehme ich an... Nun braucht ihr nur zu warten, bis der Tastendruck kommt und euch wieder die Zeit holen... Dann könnt ihr die Variable + 500 ms abziehen und habt die Reaktionszeit...
Es geht einfach nicht genauer als so...

dooya
19.07.05, 22:21
Ganz einfach :
Ihr arbeitet ja nicht mit den unsäglichen Windows Messages, sondern habt den Fokus, richtig?
Ihr führt beim Anzeigen des Strichs eine Variable ein und schaut danach bei jedem process(), ob 500 ms vergangen sind... Wenn ja, dann entfernt ihr den Strich, beziehungsweise zeichnet ihn nicht neu...
Die Reaktionszeit messt ihr ja per Tastendruck, nehme ich an... Nun braucht ihr nur zu warten, bis der Tastendruck kommt und euch wieder die Zeit holen... Dann könnt ihr die Variable + 500 ms abziehen und habt die Reaktionszeit...
Es geht einfach nicht genauer als so...Ja, so etwas habe ich mir schon gedacht. Ich werde mal testen, mit welcher Genauigkeit man so arbeiten kann.

dooya
20.07.05, 21:44
So, heute habe ich mal ein paar Tests laufen lassen und den ersten Ergebnissen zu Folge bietet die von Euch vorgeschlagene Methode im "idle"-Betrieb ca. 1 Mikrosekunde Genauigkeit, die aber in Abhängigkeit von der Art und der Anzahl von Anweisungen zwischen den Abfragen recht stark absinken kann.

Mal sehen wie es läuft, wenn die von uns gewünschte Anwendung eingebaut habe. :)