当前位置: 技术问答>linux和unix
驱动里用于获取时间差的函数有哪些?
来源: 互联网 发布时间:2016-12-11
本文导语: RT,小弟最近在搞个红外遥控的驱动,采用PPM(时间差)调制,想获取两个下降沿之间的时间差,在毫秒级别,但是我用如下代码获取时间差时竟然会得到负的时间差....以下是中断触发函数的主要内容: ...
RT,小弟最近在搞个红外遥控的驱动,采用PPM(时间差)调制,想获取两个下降沿之间的时间差,在毫秒级别,但是我用如下代码获取时间差时竟然会得到负的时间差....以下是中断触发函数的主要内容:
是do_gettimeofday这个函数的精度不够吗? 那有什么更精确点的函数吗? 谢谢 GM8180的平台。
…………
count++;
do_gettimeofday(&tv_now);
time_interval = tv_now.tv_usec - tv_last.tv_usec;
printk("ir_interrupt:count=%d,time_interval=%ldn",count,time_interval);
…………
打印结果:
ir_interrupt:count=841,time_interval=924
ir_interrupt:count=842,time_interval=93
ir_interrupt:count=843,time_interval=835
ir_interrupt:count=844,time_interval=-925 //负的时间差???!!
ir_interrupt:count=845,time_interval=356
ir_interrupt:count=846,time_interval=90
ir_interrupt:count=847,time_interval=31843
ir_interrupt:count=848,time_interval=1633
ir_interrupt:count=849,time_interval=87540 //时间差太大,
ir_interrupt:count=850,time_interval=624
是do_gettimeofday这个函数的精度不够吗? 那有什么更精确点的函数吗? 谢谢 GM8180的平台。
|
do_gettimeofday 是给用户空间调用的,估计可能导致睡眠使得时间差巨大,且中断中不允许睡眠。
驱动中
ms级别 mdelay()
us级别 udelay()
ns界别 ndelay() (2.6内核),
注意不要混用数量级,如udelay(1000)不适合干mdelay(1)的工作
这些延时函数都有些微误差
就算你用jiffies,也要注意jiffies也会发生回绕
要使用内核提供的宏操作jiffies
例如如果内核HZ=1000
延时10ms代码
unsigned long delay=jiffies+10;
while(time_before(jiffies,delay));
驱动中
ms级别 mdelay()
us级别 udelay()
ns界别 ndelay() (2.6内核),
注意不要混用数量级,如udelay(1000)不适合干mdelay(1)的工作
这些延时函数都有些微误差
就算你用jiffies,也要注意jiffies也会发生回绕
要使用内核提供的宏操作jiffies
例如如果内核HZ=1000
延时10ms代码
unsigned long delay=jiffies+10;
while(time_before(jiffies,delay));
|
那我想你就只能直接读jiffies或者找找是不是有记录tick的全局变量了。
帮顶
帮顶
|
jiffies
|
tv_now.tv_usec - tv_last.tv_usec;
你这里只计算了微妙部分啊。肯定会出现负的。
比如从1.00009到2.00008.。。
long long int consted=(tv_now.tv_sec - tv_last.tv_sec)*1e6+(tv_now.tv_usec - tv_last.tv_usec);
你这里只计算了微妙部分啊。肯定会出现负的。
比如从1.00009到2.00008.。。
long long int consted=(tv_now.tv_sec - tv_last.tv_sec)*1e6+(tv_now.tv_usec - tv_last.tv_usec);
|
会不会有ntpd在同步机器时间?