用C编码的采样循环是不准确的

时间:2018-02-18 03:46:21

标签: c time

我有一段代码用于创建高精度的采样循环。它在c中,在raspberry pi 3中运行。

采样循环指定5ms并打印5ms。但偶尔,我看到终端上印有5ms以外的号码。它不会经常发生,但它仍然是我的应用程序的关键问题。

附件是我所说的视频。它发生在40秒左右。

采样循环偶尔显示5ms以外的数字: https://youtu.be/SNcLf3Zg3_I?t=40

我想帮助调试这个问题。代码有问题吗?

代码如下:

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

#include <sys/time.h>

#define DT 0.005  //5ms

int mymillis();
int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1);

int main() {

int startInt = mymillis();
struct  timeval tvBegin, tvEnd, tvDiff;

gettimeofday(&tvBegin, NULL);

while (1)
{
    startInt = mymillis();

    //Each loop should be at least 5ms.
    while (mymillis() - startInt < (DT * 1000))
    {
        usleep(100);
    }

    printf("Loop Time %d\n", mymillis() - startInt);
}

return 0;
}

int mymillis()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000;
}

int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1)
{
    long int diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
    result->tv_sec = diff / 1000000;
    result->tv_usec = diff % 1000000;
    return (diff<0);
}

`

谢谢。

1 个答案:

答案 0 :(得分:0)

man usleep指定:

  

usleep()函数暂停执行调用线程(至少)usec微秒。任何系统活动或处理呼叫所花费的时间或系统定时器的粒度都可能会略微延长睡眠时间。

无法保证睡眠会持续更长时间。可以保证,在两者之间使用我们的睡眠时间的两个时间样本将保持彼此正好5ms的距离。

此外,您可以采样5ms值运行的长度,以查看是否随机发生过度睡眠,最终可能会关闭案例。