2016-01-28 51 views
2

我正在嘗試每10 ms週期運行一次任務。在執行任務之前,我想檢查clock_nanosleep的一致性。我花了10個值來檢查clock_nanosleep正在睡覺的時間,但它們在19-22毫秒之間變化,應該是10毫秒。當clock_nanosleep配置爲睡眠10 ms時,爲什麼睡眠20 ms?

我正在使用SCHED_FIFO,pri-98運行此線程,並在Linux中啓用了HRTimers。目前,我正在使用帶有RT Patch的3.14.29 Linux Kernel。除了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; 
    } 
} 
+0

什麼是'p_CT-> period'的價值? –

+0

「clock_getres」的結果也可能是感興趣的 - 哪個分辨率對於時鐘是實際的。 – Tsyvarev

+0

Hi Roman Zaytsev p_CT-> period = 10000;對於10毫秒的週期性 – anikhan

回答

0
  • clock_gettimeclock_nanosleep檢查返回值。也許有信號中斷
  • 運行兩個測序clock_gettime並計算平均執行時間clock_gettime。我不認爲這將是大約9-12ms,但讓我們檢查

代碼:

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);