5210|14

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

毫秒时间问题?? [复制链接]

vxWorks下可以通过读取bios端口来获得时分秒,但是如何获得毫秒级的时间呢?
比如我要记住上一个次执行和下一次执行的时间,并算出时间差,精确到毫秒,
如何做?

最新回复

有问题请先GOOGLE,BAIDU  详情 回复 发表于 2008-4-30 21:15
点赞 关注

回复
举报

90

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
vxworks有一个 tickGet 函数可获取当前tick值, 两次之差就是差值, 每个tick为10ms,除以10就是毫秒单位了。
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你用的芯片应该有计时功能吧,可以直读芯片上记录的从启动到现在通过的周期

如mips构架的软件就可以从cp0中获取,或读ZBbus的时钟周期
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
一个tick不一定是10ms这个要看你在BSP中设置的1s是多少个tick有些默认是600tick
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

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

供大家参考:

帖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要求多一点点。

 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
目前我用的是tickGet方法,把一秒的tick数设成1000,1个tick就是1ms,
Timestamp还没有试过,时间会更精确
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼上用的方法,会导致任务调度程序运行过于频繁。不建议使用。
还是用时钟戳或者辅助时钟好些。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
ningxin(资深民工)认识深刻呀。不过100MIPS以上的CPU,设置成1000问题不大,兼顾软硬实时呵呵。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
要想获得毫秒级的精确,最佳的解决方案是借助于硬件来实现,比如ixp425就提供一个timestamp的timer,它是个自由运行的Timer,用汇编语言实现读取这个timer register value,两次读取的值之差就可以算出时间跨度.
通过上述的东西,就可以实现一个毫秒级的延时程序microdelay(),类似与taskDelay()
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

10
 
如果是测量执行时间的话,可以用timex()或者timexN(),可以精确到微秒,
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

11
 
用的这个:
《目前我用的是tickGet方法,把一秒的tick数设成1000,1个tick就是1ms,
Timestamp还没有试过,时间会更精确》
但是这个用起来未必系统会精确到1ms
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
辅助时钟实现是王道。
 
 
 

回复

228

帖子

0

TA的资源

一粒金砂(中级)

13
 

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

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

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

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

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

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

回复

66

帖子

0

TA的资源

一粒金砂(初级)

14
 
程序员在深圳群已经超过1500人,里面有很多在大公司上班的成员(包括国家级的研究院),有很多经验丰富的成员(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入式操作系统),希望大家踊跃发言,找到志同道合的朋友,找到对你有帮助的朋友.第一群经过大量清人后现在公布群号:17538442,请大家加入.
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

15
 
有问题请先GOOGLE,BAIDU
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表