我正在尝试用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上运行了这个应用程序,结果似乎是随机的 之前有人见过同样的错误,
答案 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()函数
计算两个时间戳之间的差异