2013-03-21 45 views
0

我想测量运行Angstrom操作系统的Beaglebone上的方波时间。我写了一个内核驱动程序来注册一个ISR,在这个ISR中我正在计算这些脉冲。一切正常,但测量的时间间隔是完全错误的。我使用do_gettimeofday()函数来测量时间。当我在使用poll()函数的用户空间程序中做同样的事情时,我可以获得正确的值(它显示100us左右的波形大约为1007 us),但是当我使用驱动程序来测量脉冲时, 1923us。我不知道为什么内核中的时间间隔高于用户空间中的时间间隔。下面附上了我的代码。 如果有人能在我的程序中发现错误,我将不胜感激。Beaglebone do_gettimeofday()给错误时间

内核ISR:

static irqreturn_t ISR (int irq, void *dev_id) 
{ 

prev = c; 
do_gettimeofday(&c); 

printk(KERN_ALERT "%ld", (c.tv_usec - prev.tv_usec)); 
return IRQ_HANDLED; 
} 

用户空间PROG:

while(1){ 
    prev = start; 
    gettimeofday(&start, NULL); 
    rc = poll(&fdset, 1, 20000); 
    if(rc < 0){ 
     printf("Error in rc\n"); 
     return -1; 
    } 

    if(rc == 0){ 
     printf("Timed out\n"); 
     return -1; 
    } 

    if (fdset.revents & POLLPRI) { 
     len = read(fdset.fd, buf, 2); 
     printf("%ld\n", (start.tv_usec - prev.tv_usec)); 
    } 

} 
+0

[链接到另一个关于不同时钟/时间函数的问题。](http://stackoverflow.com/questions/12392278/getrusage-vs-clock-gettime-vs-clock-vs-gettimeofday) – sawdust 2013-03-21 02:18:11

+0

时间间隔可能不像你声称的那样是“错误的”。你的代码试图获得一个锁(通过在ISR中调用'do_gettimeofday()')。 – sawdust 2013-03-21 02:33:34

+0

感谢您的回复。但我不明白如何获得锁定会导致这种行为。你能解释一下吗? – user1971707 2013-03-21 06:17:03

回答

1

建档中断延迟,我觉得非常有用偷懒,设置一个GPIO引脚然后测量时用示波器。可能不是您想要的答案,但它可能会很快帮助您跨越障碍。