驱动里用于获取时间差的函数有哪些?

guan323333 2010-01-18 06:27:20
RT,小弟最近在搞个红外遥控的驱动,采用PPM(时间差)调制,想获取两个下降沿之间的时间差,在毫秒级别,但是我用如下代码获取时间差时竟然会得到负的时间差....以下是中断触发函数的主要内容:

       
…………
count++;
do_gettimeofday(&tv_now);
time_interval = tv_now.tv_usec - tv_last.tv_usec;
printk("<1>ir_interrupt:count=%d,time_interval=%ld\n",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的平台。
...全文
213 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hityu 2011-07-02
  • 打赏
  • 举报
回复
jiffies精度不够,最小单位是1ms或10ms,

无法满足红外最小560us间距的要求。

iisbsd 2010-01-19
  • 打赏
  • 举报
回复
会不会有ntpd在同步机器时间?
guan323333 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 grpubr 的回复:]
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);
[/Quote]

我看过秒的数值了,是同一秒的,但是在微秒部分,竟然tv_last.tv_usec比tv_now.tv_usec大,所以得到了负的数
deep_pro 2010-01-18
  • 打赏
  • 举报
回复
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));

grpubr 2010-01-18
  • 打赏
  • 举报
回复
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);
Wenxy1 2010-01-18
  • 打赏
  • 举报
回复
jiffies
unbutun 2010-01-18
  • 打赏
  • 举报
回复
那我想你就只能直接读jiffies或者找找是不是有记录tick的全局变量了。


帮顶

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧