Thread oder Prozess



  • Deine Timing-Werte sind im unteren Millisekunden-Bereich.

    Probier mal die Funktion gettimeofday(), die liefert den Wert des System-Timers bis auf die Mikrosekunde genau (falls vom System unterstuetzt).

    Um die Zeitintervalle zu messen, merkst Du Dir den ersten und den zweiten Wert, den gettimeofday() zurueckliefert, und subtrahierst dann, um das Ergebnis herauszubekommen.

    #include <sys/time.h>
    
    typedef unsigned long long timestamp_t;
    
    timestamp_t gettimestamp( void ) {
       struct timeval tv;
       timestamp_t    ts;
       gettimeofday( &tv, 0 );
       ts = (timestamp_t) tv.tv_sec * 1000000ULL + (timestamp_t) tv.tv_usec;
       return ts;
    }
    
    void func( void ) {
       timestamp_t ts1, ts2, diff;
    
       ts1 = gettimestamp();
    
       ...
    
       ts2 = gettimestamp();
       diff = ts2 - ts1; /* Differenz in Mikrosekunden */
    }
    


  • Hallo Danke für Eure Beiträge,

    ich bin dem Vorschlag von Marcin (mit dem select()-Befehl) gefolgt und habe jetzt ein paar Tests gemacht.

    Ich muss aber eine Zeit von 520µs erkennen können. Der kleinste Zeitintervall, denn die select()-Funktion erkennt, ist (zumindest auf meinem System) 1,953ms (was ziemlich genau 1/512 ist).

    Wenn ich also 520µs messen will, erhalte ich 0s. Kann man das irgendwie umstellen? Woran könnte das liegen?

    Viele Grüße,

    yecc



  • nichts über GTimer

    Ich meinte auch GTimer
    glib , noch nie gehört ?
    Egal. Du kannst auch den Timer so realisieren wie es Power Off gepostet hat.
    Beide Timer sind praktisch auf gut 10µs genau, wenn nicht besser.

    Wenn ich also 520µs messen will, erhalte ich 0s. Kann man das irgendwie umstellen? Woran könnte das liegen?

    Also bei mir liegt die Genauigkeit bei select() so im Bereich +/-2ms, ich weiss es leider nicht woran das liegt.
    Ich weiss nicht welche Baudrate du benutzt aber bei z.B 19200 dauert das Üertragen eines Bytes schon 500µs.



  • yecc schrieb:

    Ich muss aber eine Zeit von 520µs erkennen können. Der kleinste Zeitintervall, denn die select()-Funktion erkennt, ist (zumindest auf meinem System) 1,953ms (was ziemlich genau 1/512 ist).

    Wie hast Du die Zeit "1,953ms" gemessen?

    Manche Systemaufrufe wie poll() und select() koennen nur im ms-Bereich warten.

    Es ist dann besser, die I/O Handles auf Nonblocking zu schalten und mit einer anderen Methode zu warten.

    Mit gettimeofday() solltest Du relative genaue Zeitwerte bekommen. Mit nanosleep() kannst Du kleinere Warteintervalle machen (wenn's ueberhaupt geht).

    Denk dran, dass bei UNIX frueher das Warten im Sekundenbereich gang und gaebe war. 😉
    (d.h. die feiner aufgeloesten Wartefunktion haben ihren Weg erst in den 90ern nach UNIX gefunden, und Linux ist sowieso spaeter erst entwickelt worden; aber bei AIX und Solaris kann es einige Probleme in der Richtung geben; vielleicht heutzutage nicht mehr)



  • Hallo,

    wie ich die Zeit gemessen habe?

    Ich habe Zeichen aus einer seriellen Schnittstelle ausgelesen an die ein anderer PC Daten mit 1200 Baud gesendet hat (bei 9600 Baud konnte ich nichts messen).
    Nach der Zeitmessung von 5000 eintreffenden bytes und einer Häufigkeitsverteilung der gemessenen Werte ist es möglich, eine
    minimale Zeitdifferenz zu erkennen. Diese beträgt 0,001953~s und entspricht damit ungefähr 1/256 einer Sekunde.
    Größere Zeitdifferenzen entsprechen auffallend genau ganzzahligen Vielfachen von 0,001953~s, so dass ich angenommen habe, dass es sich bei diesem Wert um den kleinsten vom Linux Kernel messbaren Zeitintervall handelt.

    Viele Grüße



  • Ich meinte, welche Systemroutine Du dafuer aufgerufen hast.



  • Folgenden Code habe ich benutzt...:

    FILE *fp;
    	fp = fopen("statistic.txt", "a");
    	for(count = 0;count < 5000; count++)
    	{
    		FD_ZERO(&read_fds);
    		FD_SET(IInterface, &read_fds);
    
    		timeout.tv_sec = 2;
    		timeout.tv_usec = 0;
    
    		a = select(IInterface + 1, &read_fds, NULL, NULL, &timeout);
    
    		fprintf(fp,"%d,%d\n", (int) timeout.tv_sec, (int) timeout.tv_usec);
    		VSlvRead(&UCChar1);	
    	}
    
    	fclose(fp);
    


  • Wobei:

    void VSlvRead(unsigned char *UCPChar)
    {
    	read(IInterface, UCPChar, 1);
    }
    


  • Hier ein Auszug aus der Select-Manpage:

    man 2 select schrieb:

    On Linux, the function select modifies timeout to reflect the amount of time not slept;

    D.h. nach dem Aufruf von select() enthaelt die timeval-Struktur die Zeit, die nicht geschlafen wurde.



  • Hallo,

    ja, das ist klar. Ich habe natürlich dann die Zeit in timeval von 2 Sekunden abgezogen (später in der Auswertung dann...)

    Gruß und Danke


Anmelden zum Antworten