gpt4 book ai didi

linux-kernel - 为什么 clock_nanosleep 在配置为休眠 10 毫秒时却休眠 20 毫秒?

转载 作者:行者123 更新时间:2023-12-04 16:20:24 25 4
gpt4 key购买 nike

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

关于linux-kernel - 为什么 clock_nanosleep 在配置为休眠 10 毫秒时却休眠 20 毫秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35062423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com