URL: https://linuxfr.org/forums/programmation-c--2/posts/probleme-pour-faire-un-timer-precis-de-l-ordre-de-la-milliseconde Title: probleme pour faire un timer précis de l'ordre de la milliseconde Authors: cosmoff Date: 2022年01月26日T22:04:54+01:00 License: CC By-SA Tags: Score: 2 bonjour à tous, je souhaite faire un timer via timerfd_create qui reveille mon programme toutes les 1 milliseconde (ms). j'aimerais une erreur que de 10% soit pas plus de 1.1ms. Mon programme à un timer moyen de 1ms (super :) ) mais a parfois des piques à 1,2 ms voir 1,4ms :( Je l'ai passé en fifo priorité 99, j'ai viré toutes les interruptions venant de mon cpu8 afin d'empecher que mon processus soit interrompu (via /proc/irq/smp_affinity), j'ai bien entendu forcé mon programme via la commande taskset a etre que sur le cpu8, j'ai mis tous mes cpus en mode performance, j'ai mis la variable /proc/sys/kernel/sched_rt_runtime_us = -1 et pourtant rien à faire j'ai toujours des piques avec une erreur pouvant aller jusqu'a plus de 20%. Je demande des idées, merci d'avance :) PS : je précise avoir un bon PC donc il devrait tenir la charge Je vous montre mon code ca pourra peut etre aidé: ```c #include #include #include #include #include #include #include #define COUNT 10001 #define PERIODE 1000000 //1ms int main(int argc, char const *argv[]) { int timerfd; if( (timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC )) < 0) { printf("error timerfd : %s\n", strerror(errno)); return -1; } struct timespec initTimer; if( clock_gettime(CLOCK_MONOTONIC, &initTimer ) < 0 ) { printf("error clock_gettime : %s\n", strerror(errno)); return -1; } struct itimerspec setTimer ; setTimer.it_interval.tv_sec = 0; setTimer.it_interval.tv_nsec = PERIODE; setTimer.it_value.tv_sec = initTimer.tv_sec ; setTimer.it_value.tv_nsec = 0; if( timerfd_settime(timerfd, TFD_TIMER_ABSTIME, &setTimer, NULL ) < 0) { printf("error timerfd_settime : %s\n", strerror(errno)); return -1; } struct timespec now, previous; long somme = 0; long peak = PERIODE, base = PERIODE; long tabTimer[COUNT]; __uint64_t ret; if( mlockall( MCL_CURRENT | MCL_FUTURE ) < 0) { printf("error mlockall : %s\n", strerror(errno)); return -1; } if (clock_gettime(CLOCK_MONOTONIC, &previous ) < 0 ) { printf("error clock_gettime : %s\n", strerror(errno)); return -1; } for (size_t i = 0; i < COUNT; i++) { read( timerfd, &ret, sizeof(__uint64_t)); clock_gettime(CLOCK_MONOTONIC, &now ); tabTimer[i] = (now.tv_sec - previous.tv_sec) * 1000000000 + now.tv_nsec - previous.tv_nsec; previous = now; } //we write results for (size_t i = 1; i < COUNT; i++) { somme += tabTimer[i]; if( tabTimer[i]> peak) { peak = tabTimer[i]; } if( tabTimer[i] < base) { base = tabTimer[i]; } } printf("average en ns = %ld, peak = %ld, base = %ld\n", somme/(COUNT - 1), peak, base); return 0; } ```

AltStyle によって変換されたページ (->オリジナル) /