2017-05-27 10 views
0

私は、私のラズベリーパイのピンによって生成される信号をサンプリングするのが好きです。私は高いサンプルレートを実現するのが難しいという経験をしました。Linuxで周期的なGPIOピンをサンプリングする最良の方法は何ですか?

まず、私はPython(super slow)で高速なアプローチを行った。次に、ANSI C + bcm2835.h libに変更しました。私は大幅なパフォーマンス向上を得ました。

今私は自分自身に質問しています:Linuxで最良のサンプリングを行うには?

私の試行はユーザー空間で行われました。しかし、カーネル空間に切り替えるのは何ですか?私は単純な文字デバイスカーネルモジュールを書くことができます。このモジュールでは、ピンが定期的にチェックされます。状態が変更された場合、情報はバッファに入れられます。このI/Oバッファは、ユーザー空間のアプリケーション用に読み込まれた同期ファイルによってポーリングされます。私にとって最良の解決策は、固定周波数(信号処理のためのサンプル期間が一定でなければならない)でピンチェックを行うことができる場合です。

かもしれない。このためにセットアップ:

@kernel:文字モジュール+一定のサンプリング時にカーネル・スレッド+ GPIOデバイスツリーインターフェース+ DSP

@user空間:I/Oのアプリケーションから同期を読み出します文字モジュール

アイデア/ヒント?

+1

GPIOが変更されたときに何らかの割り込みを使うことができるのであれば、カーネルで行うほうが有利でしょう。カーネルモードのスレッドを作成する場合は、ユーザー空間のリアルタイムスレッドを使用する方が良いでしょう。 – rodrigo

+1

これをユーザー空間でやりたいのであれば、最近のカーネルを持っていて、 'libgpiod'がインストールされていることを確認する必要があります。 – 0andriy

+0

libgpiodは "gpio.h"カーネルインタフェースを使用しています。文字モジュールはファイルのようにピンから読み込んでいます。 ppoll + timeoutは、変更が発生したかどうかを確認するために使用されます。 lib bcm2845はメモリマップを使用してGPIOレジスタにアクセスしています。 mmuは論理アドレスを物理アドレスに変換するだけなので、私は最も速い方法だと思います。 mmapを使用すると、ピンを確認するときにデバイスレイヤーが使用されなくなります。メモリの一部を循環させるmmap +スレッドの組み合わせについて教えてください。 –

答えて

1

私には解決策があります。私は、このようなモジュールを書かれている

:あなたは同期GPIOピンから任意の信号を読み取ることができ

https://github.com/Appyx/gpio-reflect

出力を使用して、サンプリングレートで信号を計算することができます。 ピリオドを分けるだけです。

+0

このコードはピンの変化を検出しています。これはイベントベースです。私が求めていた質問は、一定のタイムベース上のピンをサンプリングしようとしていることです(ピンは、100ms毎に1,56と96のピンを読みます)。ピン(ファイルソース)を割り込みと接続することは最先端の解決策のようですが、 @Appyxの解決策はhttp://derekmolloy.ie/kernel-gpio-programming-buttons-andledles/ –

+1

に基づいていますが、送信する例を取り、gpio関数を置き換えることができます。最適な解決策は、hr_timerを使用して一定のサンプリングを行い、その値を読み取りバッファに書き込むことです。 – Appyx

+0

何が良いですか?ピンを定期的に読み書きするために、カーネルスレッドの代わりにhrtimerを使用していますか? 良いhrtimerの例がここにあります:https://gist.github.com/maggocnx/5946907 –

関連する問題