我正在尝试使用 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_MAX 和 SYS_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/