簡體   English   中英

Clock_Gettime()抖動?

[英]Clock_Gettime() Jitter?

我在Linux 2.6上使用clock_gettime()(來自time.h)來控制線程循環中的計時。 我需要在+/- 5mS的時間范圍內達到500mS。 似乎給了我500ms一段時間,然后開始漂移或抖動到+/- 30ms:

在此處輸入圖片說明

我正在使用CLOCK_REALTIME調用。 有什么方法可以改善它的偏差嗎? 我只是用它來計數每個毫秒,一旦計數器達到500,就會觸發中斷。

這也在QT 4.3框架內。 QTimer似乎比這更令人不安。

根據您問題的措辭,我覺得您可能會錯誤地累積時差。

試試這種方法:

#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;
}

每次經過所需時間后,都會更新“上一個”時間,以使用該時間段的預期時間,而不是實際時間。 本示例在每次輪詢之間使用1毫秒的睡眠時間,這可能超出了頂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM