私は、私のラズベリーパイのピンによって生成される信号をサンプリングするのが好きです。私は高いサンプルレートを実現するのが難しいという経験をしました。Linuxで周期的なGPIOピンをサンプリングする最良の方法は何ですか?
まず、私はPython(super slow)で高速なアプローチを行った。次に、ANSI C + bcm2835.h libに変更しました。私は大幅なパフォーマンス向上を得ました。
今私は自分自身に質問しています:Linuxで最良のサンプリングを行うには?
私の試行はユーザー空間で行われました。しかし、カーネル空間に切り替えるのは何ですか?私は単純な文字デバイスカーネルモジュールを書くことができます。このモジュールでは、ピンが定期的にチェックされます。状態が変更された場合、情報はバッファに入れられます。このI/Oバッファは、ユーザー空間のアプリケーション用に読み込まれた同期ファイルによってポーリングされます。私にとって最良の解決策は、固定周波数(信号処理のためのサンプル期間が一定でなければならない)でピンチェックを行うことができる場合です。
かもしれない。このためにセットアップ:
@kernel:文字モジュール+一定のサンプリング時にカーネル・スレッド+ GPIOデバイスツリーインターフェース+ DSP
@user空間:I/Oのアプリケーションから同期を読み出します文字モジュール
アイデア/ヒント?
GPIOが変更されたときに何らかの割り込みを使うことができるのであれば、カーネルで行うほうが有利でしょう。カーネルモードのスレッドを作成する場合は、ユーザー空間のリアルタイムスレッドを使用する方が良いでしょう。 – rodrigo
これをユーザー空間でやりたいのであれば、最近のカーネルを持っていて、 'libgpiod'がインストールされていることを確認する必要があります。 – 0andriy
libgpiodは "gpio.h"カーネルインタフェースを使用しています。文字モジュールはファイルのようにピンから読み込んでいます。 ppoll + timeoutは、変更が発生したかどうかを確認するために使用されます。 lib bcm2845はメモリマップを使用してGPIOレジスタにアクセスしています。 mmuは論理アドレスを物理アドレスに変換するだけなので、私は最も速い方法だと思います。 mmapを使用すると、ピンを確認するときにデバイスレイヤーが使用されなくなります。メモリの一部を循環させるmmap +スレッドの組み合わせについて教えてください。 –