0

我正在尝试在运行 Angstrom OS 的 Beaglebone 上测量方波的时间段。我编写了一个内核驱动程序来注册一个 ISR,我在其中对脉冲进行计时。一切正常,但测量的时间间隔完全错误。我正在使用 do_gettimeofday() 函数来测量时间。当我在用户空间程序中使用 poll() 函数执行相同操作时,我能够获得正确的值(对于 1000us 波它显示大约 1007us),但是当我使用驱动程序测量脉冲时,我得到的间隔为1923 年。我不知道为什么内核中的时间间隔高于用户空间中的时间间隔。我在下面附上了我的代码。如果有人能在我的程序中找到错误,我将不胜感激。

内核 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;
}

用户空间编:

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));
    }

}
4

1 回答 1

1

对于分析中断延迟,我发现懒惰并设置一个 GPIO 引脚然后用示波器测量时间非常有用。可能不是您想要的答案,但它可能会帮助您快速克服障碍。

于 2013-03-31T00:33:21.193 回答