【问题标题】:how to run Clock-gettime correctly in Vxworks to get accurate time如何在 Vxworks 中正确运行 Clock-gettime 以获得准确的时间
【发布时间】:2017-07-25 11:53:38
【问题描述】:

我正在尝试使用 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 上运行了这个应用程序,结果似乎是随机的 有没有人见过同样的错误,

【问题讨论】:

  • This 看起来和我很像,可能问题出在目标平台而不是 vxworks。

标签: c++ arm posix vxworks


【解决方案1】:

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

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

可以在运行时使用sysClkRateSet 修改实际时钟频率,无论是在您的代码中,还是从shell。

您可以使用sysClkRateGet查看当前汇率。

鉴于您看到的是 0 或 5000000ns(即 5ms),我希望您的系统时钟频率约为 200Hz。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多