Clock_Gettime()抖动?

时间:2015-06-08 03:28:04

标签: c linux qt

我在Linux 2.6上使用clock_gettime()(来自time.h)来控制线程循环中的时序。我需要在+/- 5mS时间内500mS。它似乎给了我500mS一段时间然后开始漂移或抖动到+/- 30mS:

enter image description here

我正在使用CLOCK_REALTIME调用。有没有办法改善它的偏差?我只是用它计算每个mS,一旦计数器击中500就会中断。

这也在QT 4.3框架内。 QTimer似乎比这更加紧张。

1 个答案:

答案 0 :(得分:1)

根据您问题的措辞,我觉得您可能会错误地累积您的时差。

尝试这种方法:

#include <stdio.h>
#include <time.h>

long elapsed_milli( struct timespec * t1, struct timespec *t2 )
{
    return (long)(t2->tv_sec - t1->tv_sec) * 1000L
         + (t2->tv_nsec - t1->tv_nsec) / 1000000L;
}

int main()
{
    const long period_milli = 500;
    struct timespec ts_last;
    struct timespec ts_next;
    const struct timespec ts_sleep = { 0, 1000000L };

    clock_gettime( CLOCK_REALTIME, &ts_last );

    while( 1 )
    {
        nanosleep( &ts_sleep, NULL );
        clock_gettime( CLOCK_REALTIME, &ts_next );
        long elapsed = elapsed_milli( &ts_last, &ts_next );

        if( elapsed >= period_milli )
        {
            printf( "Elapsed : %ld\n", elapsed );

            ts_last.tv_nsec += period_milli * 1000000L;
            if( ts_last.tv_nsec >= 1000000000L )
            {
                ts_last.tv_nsec -= 1000000000L;
                ts_last.tv_sec++;
            }
        }
    }
    return 0;
}

每当所需的时间段过去时,&#34;之前的&#34;更新时间以使用该时间段过去的预期时间,而不是实际时间。此示例在每次轮询之间使用1ms的休眠时间,这可能位于顶部。