为什么clock_nanosleep在配置为休眠10毫秒时会休眠20毫秒?

时间:2016-01-28 13:09:00

标签: linux-kernel posix

我试图每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;
    }
}

1 个答案:

答案 0 :(得分:0)

  • 检查clock_gettimeclock_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);