2017-07-25 75 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,它通常是从高频率定时器驱动的,并且可以用来执行短期活动的高分辨率定时。