【发布时间】:2015-06-18 11:39:35
【问题描述】:
在 C 代码(Linux 操作系统)中,我需要在一个 while 循环内准确地休眠 - 比如说,10000 微秒,共 1000 次。我试过usleep、nanosleep、select、pselect和其他一些方法都没有成功。 在大约 50 次中,它的睡眠时间会延长 %100(大约 20000 我们)。 我需要在每次延迟后执行一个动作。因此,每个延迟都必须非常准确。 有没有办法为这种情况做准确的睡眠? 谢谢..
编辑:
#include <stdio.h>
#include <sys/time.h>
int main(int argc, char *argv[]) {
struct timespec t0, t1;
long err;
int i = 0;
while (i < 1000) {
clock_gettime(CLOCK_MONOTONIC, &t0);
usleep(10000);
clock_gettime(CLOCK_MONOTONIC, &t1);
err = (long) ((t1.tv_sec - t0.tv_sec) * 1e6
+ (t1.tv_nsec - t0.tv_nsec) / 1000) - 10000;
printf("i = %d err = %ld\n", i, err);
i++;
}
return 0;
}
结果(日志文件):
i = 0 err = -146
i = 1 err = -207
i = 2 err = -8
i = 3 err = -4
i = 4 err = -22
i = 5 err = 31
i = 6 err = -45
i = 7 err = 9
i = 8 err = 61
i = 9 err = -71
i = 10 err = -24
i = 11 err = 14
i = 12 err = -12
i = 13 err = -32
i = 14 err = -15
i = 15 错误 = 42
i = 16 错误 = -51
i = 17 错误 = -19
i = 18 错误 = -12
i = 19 错误 = 4
i = 20错误 = 12
i = 21 错误 = -36
i = 22 错误 = -38
i = 23 错误 = 18
i = 24 错误 = 1
i = 25 错误 = - 21
i = 26 err = -37
i = 27 err = 31
i = 28 err = -4
i = 29 err = -45
i = 30 err = -37
i = 31 错误 = 20
i = 32 错误 = -10
i = 33 错误 = -5
i = 34 错误 = -12
i = 35 错误 = -5i = 36 err = -10
i = 37 err = -12
i = 38 err = -2
i = 39 err = 14
i = 40 err = -34
i = 41 错误 = -10
i = 42 错误 = -6
i = 43 错误 = 15
i = 44 错误 = -34
i = 45 错误 = -12
i = 46 错误 = -15
i = 47 错误 = -25
i = 48 错误 = 11614
i = 49 错误 = 2340
i = 50 错误 = 589
i = 5 1 错误 = 12254
i = 52 错误 = -93
i = 53 错误 = -19
【问题讨论】:
-
请让我们看看您使用
usleep()的尝试。这不是一个实时操作系统,但我不敢相信它有这么大的差距。 -
您确定您指示的 200 毫秒延迟取决于 usleep 功能吗?您是否确认此延迟不依赖于 ISR(中断子例程)或其他类型的系统事件?
-
我已经编辑了我的问题。对不起,输入错误的数字。由于日志文件,error仍然很高(i = 212时大约50%)。
-
感谢您的快速回答.. 仍然没有成功..