組み込みLinuxで私が最も懐かしい「小さな組み込み」機能の1つは割り込みです。特定のピンに信号が現れるか、他の割り込み要因がトリガされ、CPU内部で実行されるすべての動作が中断され、割り込みハンドラ機能が開始されます。 Linuxでは、すべてがバッファリングされており、何かが起こると、システムは独自のプロセスを続行します。 (最後に)指定されたスレッドがフォアグラウンドにインポートされると、外部ソースを待つ待機状態が終了し、対応するハンドラが起動します。
私が知っている最も近いのは、スレッドの正常な流れを妨げるためにハンドラをトリガーできる信号ですが、ハンドラはカーネルがスレッドをフォアグラウンドに取り込むまで(信号の後に数ミリ秒かかることがある)、まだ信号をキャプチャしません。 。発生 - 信号トリガもあまり強力ではありません。信号を送信するにはアプリケーションまたはカーネルモジュールが必要で、単にGPIOピンに接続することはできません。
Linuxユーザースペースソフトウェアでハードウェア割り込みのようなものをどのように実装できますか?プロセスキューがスレッドを取得するのを待つ必要なく、外部ソース条件がトリガーされるとすぐに特定の機能を開始するか、特定のスレッドをフォアグラウンドにインポートします。前景?
この質問が広すぎると思われる場合は、具体的な例で絞り込みましょう。 Raspberry PiボードはGPIOピンの1つから信号を受信します(必ずしもランダムではなく、特定のピンのみを受信しても大丈夫です)。私のユーザースペースアプリケーションは、待機状態から外れた場合、ハンドラ機能を開始したり、同等のメカニズムを実行したりしても、できるだけ短い時間内にこのイベントに応答します。しかし、最も重要なのは、作業キューがすべてを循環するのを待たないことです。ハンドラーが導入される前に、保留中のプロセスを前景に配置しますが、できるだけ早くトリガーします。 (具体的には、信号がない場合はシステムを永久にロックするのではなく、ハンドラプロセスは入力に100%CPUタイムポーリングを使用し、OSに譲歩しません。)これにはメカニズムはありますか?
ベストアンサー1
あなたの質問を私が理解しているなら、この記事はあなたが探しているものと似ていると思います。記事のタイトルは次のとおりです。ユーザー空間のデバイスドライバ。
抜粋
UIOドライバ
Linuxは、ユーザースペースベースのデバイスドライバを開発するための標準のUIO(ユーザーI / O)フレームワークを提供します。 UIOフレームワークは、2つの主要なタスクを実行する小さなカーネルスペースコンポーネントを定義します。
- ㅏ。ユーザー空間のデバイスメモリ領域を表します。
- b。デバイス割り込みを登録し、ユーザ空間に割り込みコマンドを提供します。
その後、カーネル空間 UIO コンポーネントは、/dev/uioXX などの sysfs エントリセットを介してデバイスを公開します。ユーザー空間コンポーネントはこれらのエントリを検索し、デバイスアドレス範囲を読み取り、それをユーザー空間メモリにマッピングします。
ユーザー空間コンポーネントは、デバイスのI / Oを含むすべてのデバイス管理タスクを実行できます。ただし、割り込みの場合は、デバイスエントリでブロックread()を実行する必要があります。これにより、カーネルコンポーネントはユーザースペースアプリケーションをスリープモードに設定し、割り込みを受信した後にウェイクアップします。
私はこのようなことをしたことがないので、これ以上のガイドラインを提供することはできませんが、これがあなたの追求に役立つと思います。