Component之时间戳

在VxWorks里,系统时钟的频率默认都是60。当然可以改的高一些(很多项目会用1000),但要考虑板子的性能,不建议改的太高

另外,OS默认不会使用辅助时钟,因此App需要较高精度的定时,可以考虑使用辅助时钟。不过辅助时钟的频率也是有取值范围的,PPC的几块板子支持的频率高一些,可以达到50000

如果想要更精准的定时呢?VxWorks提供了一种机制 - 高分辨率时间戳(high resolution timestamp)

使用组件INCLUDE_TIMER_SYS_SHOW的vxbTimestampShow()可以看到当前时间戳的基本属性

我这个Target的时间戳的工作频率高达1,799,xxx,xxx (Target每次重启后,频率的尾数部分都是变化的)。既然Target是X86架构的,可以装个Windows,看看CPU的属性

还是微软省事,直接四舍五入了

也就是说VxWorks的这个时间戳在X86架构里用的就是Pentium处理器的TSC (Time Stamp Counter),这个频率足够高了,因为1/1.8GHz= 0.556纳秒

那App怎么使用这个时间戳来定时呢?看看都有哪些函数

在一般设备里,中断模式就不能用了,否则能把CPU累死。试试另外几个函数吧

sysTimestampFreq()查看时间戳的频率,也就是每秒钟的计数;sysTimestampPeriod()查看系统时钟每个tick里,时间戳的计数;sysTimestamp()返回时间戳的当前计数值,不过使用时要关中断;sysTimestampLock()内部包括了关中断的操作

从打印的结果可以看到,一条printf()语句再加上一条sysTimestampLock()语句的执行只消耗大约1400个时间戳计数,耗时约1400/1.8G = 0.8us

这几个函数只使用了TSC的低32位,232/1.8G = 2.386,也就是说每2秒多,sysTimestampLock()的值就翻转了。因此,要计时的话,一般使用64位的TSC

用它们可以封装一个非常短的延时,例如微秒

测试一下。不过timex()使用的是系统时钟,精度有限,定时过短的话,可以使用timexN()来减少测量误差

综上,使用时间戳可以提供更精准的定时,硬件允许的话,甚至可以封装纳秒级的定时。不过,时间戳一般不支持中断,都是用轮询方式,这样是会消耗CPU的,因此长时间的定时就不要使用时间戳了

原文发布于微信公众号 - 这里只有VxWorks(VxWorks567)

原文发表时间:2019-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券