Linux, timerfd Genauigkeit

Ich habe ein system, dass braucht mindestens 10 mseconds der Genauigkeit für Timer.
Ich ging für timerfd wie es mir passt perfekt, aber festgestellt, dass sogar für Zeiten bis zu 15 Millisekunden, es ist nicht richtig überhaupt, entweder das, oder ich verstehe nicht, wie es funktioniert.

Den ich mal gemessen habe waren bis zu 21 mseconds auf 10 mseconds timer.
Ich habe zusammen ein schneller test zeigt, dass mein problem ein.
Hier ein test:

#include <sys/timerfd.h>
#include <time.h>
#include <string.h>
#include <stdint.h>

int main(int argc, char *argv[]){

    int timerfd = timerfd_create(CLOCK_MONOTONIC,0);
    int milliseconds = atoi(argv[1]);
    struct itimerspec timspec;
    bzero(&timspec, sizeof(timspec));
    timspec.it_interval.tv_sec = 0;
    timspec.it_interval.tv_nsec = milliseconds * 1000000;
    timspec.it_value.tv_sec = 0;
    timspec.it_value.tv_nsec = 1;

    int res = timerfd_settime(timerfd, 0, &timspec, 0);
    if(res < 0){
       perror("timerfd_settime:");
    }
    uint64_t expirations = 0;
    int iterations = 0;
    while( res = read(timerfd, &expirations, sizeof(expirations))){
        if(res < 0){ perror("read:"); continue; }
        if(expirations > 1){
            printf("%lld expirations, %d iterations\n", expirations, iterations);
            break;
        }
        iterations++;
    }
}

Und ausgeführt so:

Zack ~$ for i in 2 4 8 10 15; do echo "intervals of $i milliseconds"; ./test $i;done
intervals of 2 milliseconds
2 expirations, 1 iterations
intervals of 4 milliseconds
2 expirations, 6381 iterations
intervals of 8 milliseconds
2 expirations, 21764 iterations
intervals of 10 milliseconds
2 expirations, 1089 iterations
intervals of 15 milliseconds
2 expirations, 3085 iterations

Selbst wenn einige Verzögerungen, 15 Millisekunden Verzögerungen klingt zu viel für mich.

Meine Daten über das Gebiet sind ziemlich rostig. Sounds, die Sie wollen, etwas zu tun, in Echtzeit. Überprüfen Sie Echtzeit-Linux-Versionen. Ansonsten scheduler verwendet mehr granularities zur Vermeidung höherer overhead. Sie möchten, um Ihre Geschäftsprozesse als ein RT (real-time) ein (man sched_setparam) und vermutlich auch unter root. Für die normalen Abläufe (z.B. Spiele-oder multimedia -) du hast (1) wartet in der engen Schleife oder (2) an jedem timer-Ereignis die Berechnung der Fehler (voraussichtlich v. aktuelle wake-up-Zeit) und nehmen Sie es in das Konto bei der Weiterentwicklung der internen Zeit-abhängigen Staat.
Danke für den Tipp, aber ich denke nicht, dass 20 Millisekunden-Intervallen als Teil der RT-Domäne. Ich meine, ein standard-system, wird gebeten, zu warten, für 10 Millisekunden sollten nicht warten, 21 Millisekunden), RT klingt viel zu sehr.
Sie könnten versuchen Sie, Ihr Programm mit realtime-Priorität, die Sie wahrscheinlich nicht verwenden müssen, die RT-Linux-kernel mainline ist ziemlich gut in Echtzeit in diesen Tagen und angesichts der Tatsache, dass es nie vermisst, mehr als ein Ablauf nur laufen mit RT-Priorität sollte es sein, genug, um Sie zu verpassen Sie nie eine
auch sollten Sie überlegen, Wetter oder nicht Sie absolut nicht vertragen können, fehlt ein Wake-up, wenn Sie verpassen können, manchmal, Mach dir keine sorgen, es wird passieren, aber es ist nicht das Ende der Welt, Sie werden bekommen die die meisten von Ihnen, obwohl. Bei mir läuft es auf meinem system und es hat nicht verpasst ein timer auf der 4ms-Schleife noch, und ich habe ausgeführt für eine Weile jetzt...
Jimenez: Echtzeit verweist, von strengen Anforderungen, nicht auf tatsächliche untere Grenze an die Genauigkeit. Es gibt viele, viele Dinge, die Wirkung der Aktualität der timer Lieferung, einschließlich der version von Linux (kernel) Sie verwenden, kann die Konfiguration mit kompiliert wurde, die hardware, die Sie verwenden, und was sonst noch auf dem system ausgeführt wird.

InformationsquelleAutor Arkaitz Jimenez | 2010-06-26

Schreibe einen Kommentar