vxWorks中对时间的精确统计

时间:2022-10-23 19:12:50

原始资料来源:http://topic.csdn.net/u/20070703/12/d94a3121-4272-4715-9de4-d39e201f6f56.html

我查了一下,好多网友也给出了不少关于获得毫秒级时间的方法和建议,粘贴如下, 

供大家参考: 

帖1:  

如果支持Timestamp,BSP应提供以下函数 
sysTimestampConnect()   -   连接时间戳中断 
sysTimestampEnable()   -   使能时间戳 
sysTimestampDisable()   -   禁止时间戳 
sysTimestampFreq()   -   取得时间戳的频率 
sysTimestampPeriod()   -   取得时间戳周期 
sysTimestamp()     -   取得时间戳 
sysTimestampLock()   -   禁止中断,取得时间戳 
sysTimestampInt()     -   可选的时间戳ISR 

帖2:  
时间戳就是一个高精度的时钟吧?由于精度高,记录时间的这个变量变化的很快,所以他很快就会溢出,重新从0开始计数,我有时候用它来计算某个函数的运行时间。 

time1,time2,freq; 

freq=systimestampFreq(); 

time1=sysTimestamp(); 

myFunc(); 

time2=sysTimestamp(); 

(time2-time1)/freq大概就是时间了。 

但是,这有一个条件,就是myFunc()运行的很快,用tickGet()难以计算的情况。否则,可能当time2获取值的时候,时间戳都已经溢出了好几次了。 

就算是这样,也不定就成功,可能当得到time1的时候,变量已经要溢出,等得到time2的时候,得到是是一个很小的值,结果,time2-time1就是负值了。 

总之,利用它,在某些情况下,还是可以做一些估算的。 

帖3:  
vxWorks下的tick和timestamp没有什么相关性。也不是你说的秒和分的关系。 

tick 其实可以看成内核调度的频率,也是是时间片、watchdog超时、任务延时的单位,所以是system   clock。timestamp能够得到高精度的计时,跟RTOS调度没什么关系。比如在某个时候读寄存器的计数为A,过一段时间后再读为B,主频为f。 那么B和A之间的时间距离就是:T   =   (B-A)*f。(假设用做timestamp的timer没有rollover)对应到硬件上,tick只要timer能够产生periodic中断就 行,用做timestamp的timer要求多一点点。 

贴4

要获取精确的毫秒的时间间隔,而且频繁的调用又不导致系统CPU占用率过高。 
我建议采取   通过   CPU   机器周期的方法解决。 

基本上大部分主流CPU都一个64位寄存器用来记录CPU上电后的   机器周期个数。 
你可以编写一个汇编函数获取这个   64位计数。 

然后你在程序开工时,作一个10秒的定时,在定时前后各获取一次CPU   机器周期。 
然后相减,就可以得到每秒钟的CPU   机器周期, 
这个数字除以1000就是每毫秒的CPU   机器周期。 
这个值可以在运行中作为常量,使用我们将之命名位   毫秒因子 

然后你在上一个次执行时取一下上一个次执行和下一次执行, 
下一次执行时再取一次上一个次执行和下一次执行。 
两次相减得到   间隔的CPU   机器周期   。然后利用上面毫秒因子换算成毫秒就可以了。、 

利用这种方法你就是想精确到   纳秒   也是可以的。 

我们经常用这个方法来测量   一段代码的准确执行时间。