我正在尝试每 10 毫秒定期运行一个任务。在执行任务之前,我想检查 clock_nanosleep 的一致性。我取了 10 个值来检查 clock_nanosleep 正在休眠的时间,但它们在 19-22 毫秒之间变化,应该是 10 毫秒。
我正在使用 SCHED_FIFO、pri-98 运行此线程,并在 Linux 中启用了 HRTimers。目前,我正在使用带有 RT 补丁的 3.14.29 Linux 内核。除了 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;
}
}
请您参考如下方法:
- 检查
clock_gettime和clock_nanosleep的返回值。可能有信号中断 - 运行两个顺序的
clock_gettime并计算clock_gettime的平均执行时间。我不认为它会在 9-12 毫秒左右,但让我们检查一下
代码:
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);




