我正在尝试在运行 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));
}
}