web-dev-qa-db-ja.com

Linuxユーザー空間での割り込みと同様の機能を実現できますか?

Embedded Linuxの「小さな組み込み」で最も見逃している機能の1つは、割り込みです。特定のピンに信号が表示されるか、他の割り込みソースがトリガーされ、CPU内で行われた処理がすべて中断され、割り込みハンドラーの機能が起動します。 Linuxではすべてがバッファリングされ、何かが起こった場合、システムはそれ自体の経路をたどり、(最後に)指定されたスレッドがフォアグラウンドに移行すると、外部ソースを想定した待機状態が終了し、ハンドラが起動します。

私が知っている最も近いのはシグナルであり、スレッドの通常のフローを中断するハンドラーをトリガーできますが、それでも、カーネルはスレッドがフォアグラウンドになるまでシグナルを取得しません。シグナルが発生してから数ミリ秒かかる場合があります。 -信号のトリガーもそれほど堅牢ではありません。信号を送信するにはアプリまたはカーネルモジュールが必要です。単純にGPIOピンに接続することはできません。

Linuxユーザースペースソフトウェア内のハードウェア割り込みと同様の機能を実現するにはどうすればよいですか?プロセスキューがスレッドをフォアグラウンドにするのを待たずに、外部ソース条件がトリガーされた直後に特定の関数を起動するか、特定のスレッドをフォアグラウンドにしますか?

この質問が広すぎると思われる場合は、具体的な例に絞ってみましょう。RaspberryPiボードは、そのGPIOピンの1つで信号を受信します(必ずしも任意ではありません。一部のピンだけがそれを実行できる場合は問題ありません)。可能な限り短い時間内にこのイベントに反応するユーザー空間アプリケーション。イベントを待機状態から解除し、ハンドラー関数または同等のメカニズムを起動しますが、何よりも、ハンドラーが呼び出される前に保留中のすべてのプロセスをタスクキューが循環するのを待ちません。フォアグラウンドに、しかしそれをできるだけ早くトリガーします。 (具体的には、シグナルがない場合、ハンドラープロセスが100%CPU時間を使用してシステムを永久にロックしたままにしておき、入力をポーリングしてOSに譲ることはありません。)そのようなメカニズムはありますか?

25
SF.

私があなたの質問を理解すると、この記事はあなたが探しているもののように聞こえます。記事のタイトル: ユーザースペースのデバイスドライバー

抜粋

UIOドライバー

Linuxは、ユーザー空間ベースのデバイスドライバーを開発するための標準UIO(ユーザーI/O)フレームワークを提供します。 UIOフレームワークは、次の2つの主要なタスクを実行する小さなカーネルスペースコンポーネントを定義します。

  • a。デバイスのメモリ領域をユーザー空間に示します。
  • b。デバイスの割り込みを登録し、ユーザー空間に割り込みを通知します。

カーネル空間のUIOコンポーネントは、/ dev/uioXXのような一連のsysfsエントリを介してデバイスを公開します。ユーザー空間コンポーネントはこれらのエントリを検索し、デバイスのアドレス範囲を読み取ってユーザー空間メモリにマップします。

ユーザー空間コンポーネントは、デバイスからのI/Oを含むすべてのデバイス管理タスクを実行できます。ただし、割り込みの場合は、デバイスエントリでブロッキングread()を実行する必要があります。これにより、カーネルコンポーネントがユーザー空間アプリケーションをスリープ状態にして、割り込みを受信すると起動します。

これまでに行ったことがないので、これ以上のガイダンスを提供することはできませんが、あなたの探求に役立つと思いました。

10
slm

@RBerteigと同じように考えると、BeagleBone Blackにはプログラマブルリアルタイムユニット(PRU) 2ビットマイクロコントローラー が含まれています。

これらの機能を最大限に活用している巨大なコミュニティは存在しないようです。これに適したコンパイラがあるかどうかさえわかりません。 SBCとマイクロコントローラーまたはマイクロコントローラーボードのアセンブリよりも優れている点は、PRUコードがメインARMから取得でき、共有メモリが非常に便利なことです。

私がこれを使用した、またはまだBeagleBone Blacksでいくつかの例を実行したとは言えませんが、この質問で示されたニーズは、開発者を黒と離れてパイ。

2
Scott Seidman

ちょっと箱の外で考えると、これは alaモードボード のようなものの使用の良い例かもしれません。これは完全なArduinoを含む「piプレート」です。 AVRプロセッサで実行するハードリアルタイム応答、ビットバンギングバスプロトコル、またはその他の深く埋め込まれたロジックを構築し、より高いレイテンシチャネルを介してLinuxのプロセスに通信します。

既製のハードウェアの選択肢はalaモードだけではありません。 LinuxとArduinoの両方を提供する同等のArduinoモデルは ArduinoYún で、MIPSベースの組み込みLinux SOCとAVRの両方を備えています。 ArduinoはARM SOCに基づいて Arduino Tre も発表しましたが、1年前から「近日公開」されています。 RPiとArduinoの両方がより多くの馬力から利益を得ることができる場合、クアッドコアARM CORTEX-A9を備えた [〜#〜] udoo [〜#〜] もあります。 LinuxまたはAndroidを実行するGPU、および Arduino Due と同じAtmel ARM CORTEX-M3チップ。

問題がこのパーティショニングの影響を受けやすい場合は、ネットワークとビジネスロジックを処理する完全なLinuxカーネルを備えたまま、GPIOピンとの間にOSレイヤーがなく、金属上で直接実行されるディープエンベデッドシステムのすべての利点が得られます。 、ユーザーインターフェイス、およびディスクドライブやビデオなどの複雑なハードウェア。 Arduinoが低レベルの処理に対して十分に強力でない場合、考慮すべき代替の深く埋め込まれたチップとモジュールがたくさんあります。それらのほとんどすべてに、Linuxエンドとの通信に使用できるUART、I2C、またはUSBさえありますものの。

このアーキテクチャの利点の1つは、おそらくLinuxカーネルに触れる必要がないことです。ハードリアルタイムコードは、カーネルの外部の独自のCPUで実行されており、2つの間の通信は既存のドライバーとプロトコルを使用できます。

1
RBerteig