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/システムによってはジッターが発生する可能性があります。ロード、良いアプローチのようには見えません。そうするより良い方法はありますか?
ありがとう!