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 に答える