Exakte Zeiten...

Von: , Frage gestellt am Fr, 15. Jun 2001

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

10 Antworten zu dieser Frage

  1. Antwort von nach einem Tag 0 hilfreich
    Re: Exakte Zeiten...

    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)

    • Antwort von nach 2 Tagen 0 hilfreich
      Re^2: Exakte Zeiten...

      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)

      • Antwort von nach 2 Tagen 0 hilfreich
        Re^3: Exakte Zeiten...

        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)

        • Antwort von nach 2 Tagen 1 hilfreich
          Re^4: Exakte Zeiten...

          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... :-(

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

          Merci,
          Alexander

          • Antwort von nach 3 Tagen 1 hilfreich
            Re^5: Exakte Zeiten...

            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)

            • Antwort von nach 3 Tagen 0 hilfreich
              Re^6: Exakte Zeiten...

              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)

            • Antwort von nach 5 Tagen 2 hilfreich
              Re^7: Exakte Zeiten...

              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.

          • Antwort von nach 4 Tagen 0 hilfreich
            Re^5: Exakte Zeiten...

            Das WinAPI-Posting bringt mir da leider nicht so viel... :-(
            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

  2. Antwort von nach 2 Tagen 0 hilfreich
    Re: Exakte Zeiten...

    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 <windows.h>
    #include <stdio.h>
    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;
    }
    



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!