如何在Vxworks中正确运行Clock-gettime以获得准确的时间

时间:2017-07-25 11:53:38

标签: c++ arm posix vxworks

我正在尝试用Linux和Vxworks来衡量C ++程序中的进程所花费的时间。我注意到clock_gettime(CLOCK_REALTIME,timespec)足够准确(分辨率大约1 ns)来完成许多Oses的工作。对于可移植性问题,我使用此功能并在Vxworks 6.2和Linux 3.7上运行它。 我试图通过简单的印刷来衡量时间:

    #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,我有很多零,然后是5000000 ns,然后是很多零... PS,对于vxwroks,我在ARM-cortex A8上运行了这个应用程序,结果似乎是随机的 之前有人见过同样的错误,

2 个答案:

答案 0 :(得分:0)

在vxworks中,时钟分辨率由系统调度程序频率定义。默认情况下,这通常为60Hz,但可能因BSP,内核配置或运行时配置而异。

VxWorks内核配置参数 SYS_CLK_RATE_MAX SYS_CLK_RATE_MIN 定义支持的最大值和最小值, SYS_CLK_RATE 定义启动时应用的默认速率

实际时钟速率可以在运行时使用sysClkRateSet在您的代码中或从shell中修改。

您可以使用sysClkRateGet确认当前费率。

鉴于你看到的是0或5000000ns - 这是5ms,我希望你的系统时钟频率是~200Hz。

要获得更高的分辨率,可以提高系统时钟频率。但是,这可能会产生不良副作用,因为这会增加某些系统操作的频率。

更好的定时代码方法可能是使用sysTimestamp,它通常由高频定时器驱动,可用于执行短期活动的高分辨率计时。

答案 1 :(得分:-1)

我认为在vxworks中默认情况下,时钟分辨率为16.66ms,您可以通过调用clock_getres()函数获得。您可以通过调用sysclkrateset()函数来更改分辨率(支持的最大分辨率是200us,我猜通过将5000作为参数传递给sysclkrateset函数)。然后,您可以使用difftime()函数

计算两个时间戳之间的差异