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