
組み込み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()を実行する必要があります。これにより、カーネルコンポーネントはユーザースペースアプリケーションをスリープモードに設定し、割り込みを受信した後にウェイクアップします。
私はこのようなことをしたことがないので、これ以上のガイドラインを提供することはできませんが、これがあなたの追求に役立つと思います。
答え2
@RBerteigと同様に、BeagleBone BlackにはプログラマブルPRU(リアルタイムデバイス)が含まれています。32ビットマイクロコントローラ。
これらを活用する巨大なコミュニティはないようです。良いコンパイラがあるかどうかはわかりません。 SBCおよびマイクロコントローラまたはマイクロコントローラボードアセンブリと比較して利点は、PRUコードがメインARMから出ることができ、共有メモリが非常に便利であることです。
これを使用したとは言えず、BeagleBone Blackでより多くの例を実行することはできませんが、この質問で表現された要件は、開発者がこれらの要件をBlackに向かってPiから遠ざけることができるかもしれません。
答え3
固定観念から外れて考えてみると、次のような方法を使って行うことができます。アッラーパターンボード。これは完全なArduinoを含む「パイボード」です。ハードリアルタイムレスポンス、ビットバスプロトコル、または他の深く組み込まれたロジックを構築することで、AVRプロセッサで実行し、レイテンシの長いチャネルを介してLinuxのプロセスと通信できます。
alaモードは、利用可能な唯一の既製のハードウェアオプションではありません。 LinuxとArduinoで利用可能な類似のArduinoモデルは次のとおりです。ArduinoクラウドMIPSベースの組み込みLinux SOCとAVRの両方を備えています。 Arduinoも発表しました。アドゥイノ・トレARM SOCに基づいていますが、1年間「すぐにリリース」されました。 RPiとArduinoの両方がより多くの馬力の利点を享受できれば、次のことがあります。優秀、クアッドコアARM CORTEX-A9およびLinuxまたはAndroidを実行するGPU、以前の世代と同じAtmel ARM CORTEX-M3チップを搭載Arduino 期限。
問題がこの種のパーティショニングに対応する場合、ネットワーク、ビジネスロジック、ユーザーインターフェース、ディスクドライブ、ビデオなどの複雑なハードウェア。 Arduinoが低レベルの処理を実行するのに十分強力でない場合は、考慮する必要がある詳細な埋め込みチップとモジュールがたくさんあります。ほとんどすべてのチップとモジュールには、Linux側との通信に使用できるUART、I2C、またはUSBもあります。
このアーキテクチャの利点の1つは、Linuxカーネルにまったく触れる必要がないことです。ハード・リアルタイム・コードはカーネル外の独自のCPU上で実行され、両者間の通信は既存のドライバとプロトコルを使用することができます。