我正在尝试每 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_gettimeclock_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); 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!