1

Xenomai を ARM PC (Xenomai 2.5.6 - Linux Kernel 2.6.35.9) にインストールしており、10 kHz クロック信号を読み取る必要があります。信号は、システム ファイルにマップされている GPIO の 1 つに電気的に接続されています。ユーザー空間でタスクを作成し、時間を測定しながらファイルを開いて読み取り、閉じると、平均で 650 µs の遅延が発生します (つまり、これは、完全なオープン - 読み取り - クローズ サイクルにかかる時間です)。これにより、約 1.5 kHz のサンプリング レートが得られます。

while(1) // Task's infinite loop
{
    t1 = rt_timer_read();
    if((fd = open("test_file",O_RDONLY)) > 0)
    {
        read(fd,&buff,1);
        close(fd);
    }else{
        errors++;
    }
    t2 = rt_timer_read();
    t += t2-t1;

    rt_task_wait_period(NULL);
}

出力:

[RT:]   Start reading files:   05:19:05.804.754
[RT:]   End reading files:     05:19:13.338.078
[RT:]   Average time (10000 open-read-close cycles): 00000671.901 (microseconds)
[RT:]   Errors found: 0
[RT:]   (sig_handler) Signal received! (signo = 2)

インターネットのどこかで、タスクをユーザー空間ではなくカーネル空間で実行するように強制すると、実行が高速化されると読んだことがありますが、これで十分かどうか、また私がしようとしていることかどうかはわかりませんここで行うことは完全に正しいです。

私は電子工学のバックグラウンドを持っており、同期信号 (クロック信号など) を非同期に処理しないように、また定期的なタスクを使用してファイル (つまり、同期信号) を読み取るように常に言われてきました。CPU/システムによってはジッターが発生する可能性があります。ロード、良いアプローチのようには見えません。そうするより良い方法はありますか?

ありがとう!

4

1 に答える 1

1

これが可能な解決策に関する私の考えです。同期信号を非同期に処理するべきではありません。したがって、ユーザー空間で fd を開いて GPIO から信号レベルを読み取ることは避けてください。

代わりに、より適切なカーネル空間でこれを処理する必要があります。カーネル空間に入ると、GPIO を irq としてセットアップして、立ち上がり/立ち下がりエッジでトリガーし、Xenomai を介してリアルタイムで処理できます。レイテンシーは解消されませんが、10 KHz のクロック速度では問題ないはずです。

残念ながら、クロック信号で何をしているのかを指定していません。何らかのデバイスのスレーブドライブとして機能しようとしていると思いますか?

いずれにせよ、私が役に立てば幸いです。

于 2013-12-20T07:16:11.527 に答える