Exakte Zeiten

…wie kann ich möglichst exakte Zeiten mit dem PC realisieren???
Ich würde gerne mit C++ Zeiten messen, die möglichst genau sind. Kann man im ms-Bereich messen? Oder sogar µs-Bereich???
Wie ist das möglich???
Und wie sieht es mit zusätzlichen Boards aus? Spezieller Timer-IC??

Naja, bin mal auf Antworten gespannt…
Grüße
Alexander

Hallo Alexander

…wie kann ich möglichst exakte Zeiten mit dem PC
realisieren???
Ich würde gerne mit C++ Zeiten messen, die möglichst genau
sind. Kann man im ms-Bereich messen? Oder sogar µs-Bereich???
Wie ist das möglich???

ms sind mit einem PC machbar, aber es hängt auch noch vom verwendeten Betriebssystem ab. Es kann auch gut sein, dass 1000 Messungen Stimmen und dann eine komplett daneben liegt, weil irgend ein Treiber den Interrupt zu lange gesperrt hat.

Und wie sieht es mit zusätzlichen Boards aus? Spezieller
Timer-IC??

Mit einem zusätzlichen (Timer) Board ist das ganze auch mit us kein Problem. Mit deinem zu messenden Signal wird der Zähler gestartet und auch wieder gestoppt. Danach spielt es dann keine Rolle mehr wiviel Zeit vergeht bis die CPU die Daten ausliest.

MfG Peter(TOO)

Ich würde gerne mit C++ Zeiten messen, die möglichst genau
sind. Kann man im ms-Bereich messen? Oder sogar µs-Bereich???
Wie ist das möglich???

ms sind mit einem PC machbar, aber es hängt auch noch vom
verwendeten Betriebssystem ab. Es kann auch gut sein, dass
1000 Messungen Stimmen und dann eine komplett daneben liegt,
weil irgend ein Treiber den Interrupt zu lange gesperrt hat.

Wie genau kann ich das realisieren?? Hättest Du vielleicht ein Beispiel-Source-Programm??
Welches Betriebssystem ist denn am besten?? Hätte Win98 und Linux zur Verfügung, aber zeitweise auch Unix!

Und wie sieht es mit zusätzlichen Boards aus? Spezieller
Timer-IC??

Mit einem zusätzlichen (Timer) Board ist das ganze auch mit us
kein Problem. Mit deinem zu messenden Signal wird der Zähler
gestartet und auch wieder gestoppt. Danach spielt es dann
keine Rolle mehr wiviel Zeit vergeht bis die CPU die Daten
ausliest.

Vielen Dank schonmal!!
Grüße Alexander

MfG Peter(TOO)

In Pentium-Prozessoren gibt es sehr genaue „Performance Counters“. Die Frequenz ist nicht unbedingt immer gleich, laesst sich jedoch ermitteln. Auf meinem Pentium II-400 ist sie z.B. 3579545 Zaehler pro Sekunde entsprechend einer Aufloesung von etwa 0,3 Mikrosekunden.

Mit der Win32-API braucht man nur zwei Funktionen: QueryPerformanceFrequency() und QueryPerformanceCounter(). Schau’ Dir einfach mal das folgende Beispiel an.

Mit diesen Befehlen kann man uebrigens nur Zeit-ABSTAENDE messen, falls Du Uhrzeiten brauchst, musst Du Dir also von irgendwoher noch die genaue Zeit besorgen.

–Mathias

#include 
#include 


int main()
{
 LARGE\_INTEGER iFreq;

 QueryPerformanceFrequency(&iFreq);

 printf("Frequency : %20d\n",iFreq.QuadPart);

 LARGE\_INTEGER iBegin, iEnd;

 QueryPerformanceCounter(&iBegin);

 Sleep(1000);

 QueryPerformanceCounter(&iEnd);

 printf("Begin : %20d\n",iBegin.QuadPart);
 printf("End : %20d\n",iEnd.QuadPart);
 printf("Difference: %20d\n",iEnd.QuadPart-iBegin.QuadPart);

 printf("Time : %4.15f\n s",(double)(iEnd.QuadPart-iBegin.QuadPart)/iFreq.QuadPart);

 return 0;
}

Hallo Alexander

Wie genau kann ich das realisieren?? Hättest Du vielleicht ein
Beispiel-Source-Programm??
Welches Betriebssystem ist denn am besten?? Hätte Win98 und
Linux zur Verfügung, aber zeitweise auch Unix!

Was willst du eigentlich genau machen ??

MfG Peter(TOO)

Was willst du eigentlich genau machen ??

Ich würde gerne physikalische Messungen durchführen. Am liebsten ohne großen Kosten- und Zeitaufwand!
Darum wäre mir am liebsten eine Art C+±Stoppuhr unter Linux mit sehr guter Genauigkeit. Allerdings will ich das eben selbst programmieren (für eigene Anwendungen).
Das WinAPI-Posting bringt mir da leider nicht so viel… :frowning:

Hättest Du vielleicht einen Quellcode für Linux-C++ ???

Merci,
Alexander

Hallo Alexander

Ich würde gerne physikalische Messungen durchführen. Am
liebsten ohne großen Kosten- und Zeitaufwand!
Darum wäre mir am liebsten eine Art C+±Stoppuhr unter Linux
mit sehr guter Genauigkeit. Allerdings will ich das eben
selbst programmieren (für eigene Anwendungen).

Mit deiner Antwort kann ich eigentlich nichts anfangen, dass du physikalische Messungen durchführen willst ist ja klar, schliesslich ist die Zeit ja eine.
Aber was für eine Grösse ist genau??

Es ist scheinbar mittlerweile allgemein üblich mit solchen Begriffen um sich zu werfen, ohne sich irgendwelche Gedanken zu machen. Da du angibst Physik zu studieren solltest du eigentlich über solche Dinge bescheid wissen. 5 und 5.0 sind halt nicht das gleiche und wenn es um die Zeit geht ist so der Bereich zwischen 10^18 bis 10^-40 Sekunden in der Physik üblich. Was ich vermisse ist die zu messende Zeit und die geforderte Genauigkeit. Daraus ergibt sich dann die erforderliche Auflösung. Deine ürsprüngliche Frage war ja schon sehr „ungenau“ (Faktor 10^3).

Hättest Du vielleicht einen Quellcode für Linux-C++ ???

Für Linux habe ich leider nichts.

MfG Peter(TOO)

Aber was für eine Grösse ist genau??

Also: Hast Du einfach Tipps für Zeitmessungen! Egal mit welcher Genauigkeit! Beispiele! Egal für welches Betriebssystem!

Hättest Du vielleicht einen Quellcode für Linux-C++ ???

Für Linux habe ich leider nichts.

Schade! Aber vielleicht lässt sich ja was umschreiben…

MfG Peter(TOO)

Hallo,

auf
http://www.gnu.org/manual/glibc-2.0.6/html_chapter/l…
werden die Datums und Zeitfunktionen der Libc (=> Linux) erklärt, da ist auch ein Beispiel mit dabei. Wenn Du Fragen dazu hast, kann ich dir leider nicht helfen, ich habe noch nicht damit gearbeitet…

Gruss,
Max

Das WinAPI-Posting bringt mir da leider nicht so viel… :frowning:

Toll. Du weisst anscheinend nicht ganz, was Du willst. Einerseits ist Dir das Betriebssystem egal, aber Windows soll es dann doch wieder nicht sein, oder wie? Da bin ich der einzige, der Dir funktionierenden Source bietet, aber mir wuerdigst Du nur diese eine Zeile da oben?

Du kannst Dur ja mal die PCL fuer Linux angucken, die duerfte das gleiche koennen wie QueryPerformanceFrequency()/QueryPerformanceCounter() von Windows. Vielleicht findest Du dabei auch raus, was Du eigentlich willst.

http://www.kfa-juelich.de/zam/PCL/doc/pcl/pcl.html

Viel Erfolg.

–Mathias

Hab vielleicht was für Dich, einzige Einschränkung: nur lauffähig auf Intel-Plattformen (ab Pentium) und nur verwendbar bei Compilern mit inline-Assembler-Unterstützung.

Grundlagen:
Seit dem Pentium gibts ein 64-Bit-Register (Time-Stamp-Counter), welches bei jedem Prozessortakt inkrementiert und bei jedem Prozessorreset zurückgesetzt wird.
Gelesen wird dieses Register über den rdtsc-Assembler-Befehl, der die oberen 32 Bit in das EDX-Register und die unteren 32 Bit in das EAX-Register schreibt. Bei 400 MHz Taktfrequenz reichen die unteren 32 Bit aus, wenn man keine Zeiten messen will, die länger als 10 s sind.

Kleines Problem:
rdtsc ist nicht serialisierend, das heißt, der Befehl kann zur besseren Ausführung in der zeitlichen Abarbeitung verschoben werden (durch die Speculative Execution Unit der CPU).
Lösung:
Man stellt einen serialisierenden CPU-Befehl voran (etwa cpuid).

Mit folgedem C/C+±Code lässt sich der Spass lösen:

void ReadTSCLow( unsigned int& runLow )
{
 \_\_asm cpuid
 \_\_asm rdtsc
 \_\_asm mov runLow,eax
}

Aufruf:

#define CPU\_CLK 700 // CPU-Takt in MHz

unsigned int unTSCStart, unTSCEnd, unTSCDiff;

// Start-Wert holen
ReadTSCLow( unTSCStart );

// Vorgang durchführen

// End-Wert holen
ReadTSCLow( unTSCEnd );

// Verstrichene Zeit in us berechen:
unTSCDiff=( unTSCEnd-unTSCStart )/CPU\_CLK;

Damit solltest Du eine Code-Basis haben, die für alle Betriebssysteme mit halbwegs modernem Compiler verwendbar ist.

Ist Dir damit nicht geholfen, ist Dir nicht zu helfen.

Grüsse Safog

P.S.: Es gibt keine 100%ige Garantie für Echtzeitfähigkeit. Siehe dazu auch versch. Forschungsarbeiten am Lehrstuhl für Realzeit-Computersysteme an der TU München.