2017-07-25 945 views
1

我試圖用Linux和Vxworks測量C++程序中的進程所花費的時間。我注意到clock_gettime(CLOCK_REALTIME,timespec)足夠準確(分辨率約爲1 ns),可以在許多Oses上完成這項工作。對於一個可移植性問題,我使用這個函數並在Vxworks 6.2和linux 3.7上運行它。 我已經盡力衡量一個簡單的打印所需的時間:如何在Vxworks中正確運行Clock-gettime以獲得準確的時間

#define <timers.h< 
    #define <iostream> 
    #define BILLION 1000000000L 
    int main(){ 
     struct timespec start, end; uint32_t diff; 
     for(int i=0; i<1000; i++){ 
     clock_gettime(CLOCK_REALTME, &start); 
     std::cout<<"Do stuff"<<std::endl; 
     clock_gettime(CLOCK_REALTME, &end); 
     diff = BILLION*(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec); 
     std::cout<<diff<<std::endl; 
     } 
     return 0; 
    } 

我編這對Linux和VxWorks。對於Linux結果似乎是邏輯的(平均20μs)。但是VxWorks的,我已經得到了很多零,那麼500萬納秒,那麼很多的零... PS,對於vxwroks,我拼命地跑在ARM-Cortex A8的這個應用程序,以及結果似乎隨機 已經有人看到了同樣的錯誤前,

+0

[這](https://stackoverflow.com/questions/13474000/arm-performance-counters-vs-linux-clock-gettime)類似於我,也許問題是與目標平臺,而不是VxWorks的。 – Steeve

回答

-1

我覺得在默認情況下,VxWorks的時鐘分辨率爲16.66ms,你可以通過調用clock_getres()函數來獲取。您可以通過調用sysclkrateset()函數來更改分辨率(支持的最大分辨率是200us,我猜想通過將5000作爲參數傳遞給sysclkrateset函數)。然後,可以使用difftime()函數

0

在VxWorks中計算兩個時間戳之間的差,所述時鐘分辨率由系統調度頻率定義。默認情況下,這通常爲60Hz,但可能因BSP,內核配置或運行時配置而異。

VxWorks內核配置參數SYS_CLK_RATE_MAXSYS_CLK_RATE_MIN限定最大和支持的最低值,並且SYS_CLK_RATE定義了默認速率,在啓動應用。

實際的時鐘速率可以在使用sysClkRateSet運行時修改,無論是在代碼中,或者從外殼。

您可以使用sysClkRateGet檢查當前費率。

既然你看到0或5000000ns - 這爲5ms,我希望你的系統時鐘速率是〜200Hz範圍內。

要獲得更高的分辨率,可以增加系統時鐘頻率。但是,這可能會產生不希望的副作用,因爲這會增加某些系統操作的頻率。

一個更好的時間代碼方法可能是使用sysTimestamp,它通常是從高頻率定時器驅動的,並且可以用來執行短期活動的高分辨率定時。