我试图每10毫秒定期运行一个任务。在执行任务之前,我想检查clock_nanosleep
的一致性。我用了10个值来检查clock_nanosleep
正在睡觉的时间,但它们在19-22毫秒之间变化,这应该是10毫秒。
我正在使用SCHED_FIFO,pri-98运行此线程,并在Linux中启用了HRTimers。目前,我正在使用3.14.29 Linux内核和RT补丁。除了HRTIMERS,clock_nanosleep
是否需要Linux中的任何额外配置?
以下是我正在运行的代码段:
struct timespec arr[20];
while(1) {
clock_gettime(CLOCK_MONOTONIC,&check1);
if(i<20) {
arr[i].tv_sec = check1.tv_sec;
arr[i].tv_nsec = check1.tv_nsec;
++i;
}
check1.tv_nsec += p_CT->period;
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &check1, NULL);
clock_gettime(CLOCK_MONOTONIC,&check);
if(i<20) {
arr[i].tv_sec = check.tv_sec;
arr[i].tv_nsec = check.tv_nsec;
++i;
}
}
答案 0 :(得分:0)
clock_gettime
和clock_nanosleep
的返回值。也许有信号中断clock_gettime
并计算clock_gettime
的平均执行时间。我不认为它会在9-12ms左右,但让我们检查代码:
int r1 = clock_gettime(CLOCK_MONOTONIC,&check1);
int r2 = clock_gettime(CLOCK_MONOTONIC,&check);
if(i<20) {
arr[i].tv_sec = check1.tv_sec;
arr[i].tv_nsec = check1.tv_nsec;
++i;
}
if(i<20) {
arr[i].tv_sec = check.tv_sec;
arr[i].tv_nsec = check.tv_nsec;
++i;
}
printf("%d %d\n", r1, r2);