c++ - 如何在Vxworks中正确运行Clock-gettime获取准确时间

标签 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 上运行这个应用程序,结果似乎是随机的 以前有没有人见过同样的错误,

最佳答案

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

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

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

您可以使用 sysClkRateGet 检查当前速率。

鉴于您看到的是 0 或 5000000ns - 即 5ms,我预计您的系统时钟速率约为 200Hz。

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

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

关于c++ - 如何在Vxworks中正确运行Clock-gettime获取准确时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45302501/

相关文章:

c++ - 我应该实现自己的 TCP/IP 套接字超时吗?

ios - 通过应用程序加载程序上传期间,iOS应用程序 “missing 64-bit support”错误

c - 如何使用 NDK 在 ARM 内联汇编中执行简单循环?

c - 如何增加C中正在运行的程序的堆栈大小

c++ - 我的 Z 缓冲区计算有什么问题?

c++ - 时区变化的 FILETIME 信息检索

c++ - 虚拟继承、默认构造函数和额外复制

c - 如何从 2 个进程 ping/dev/watchdog?

调用信号处理程序但仍然忽略信号 (Posix, C)

c - 访问区域设置信息