割り込みハンドラは、割り込み時に通信チャネルからの受信データを保存します。
デバイス ドライバーの割り込みサービス ルーチン (ISR) は、通常、受信条件、送信条件、およびエラー & ステータス イベントの割り込みを処理します。複数の割り込みラインを持つデバイスがありましたが、現在ではほとんどすべてのデバイスに 1 つの割り込みラインしかなく、割り込みを生成した条件を判断するために割り込みステータス レジスタを調べる必要があります。
受信のみに ISR を使用するのは珍しいことです。
Kthread は、通信チャネルからデータを送信します。
デバイス ドライバに関連付けられたスレッドは、「下半分の処理」用のタスクレットである可能性が高くなります。これは、ISR での処理時間を最小限に抑えながら、特に受信したパケット/フレームで生データの処理を実行する手法です。
kthread を使用してデータを送信するのは非正統的であり、問題が発生する可能性があります (回避可能なクリティカル領域など)。使用可能な DMA と Tx 割り込みがないために、スレッドがポーリングされたプログラムされた I/O を実行している場合、そのようなスキームが正当化される可能性があります。
システムコールを使用して、ドライバーを構成したり、そのステータスを取得したりできます。
Linux デバイス ドライバーには、一連のエントリ ポイントが既に定義されています。Linux デバイス ドライバーのエントリ ポイント
これらのエントリ ポイントのほとんどは、システム コールを介してユーザー アプリから間接的にアクセスされます。
syscall がドライバー用に特別に作成されることはほとんどありません。
また、割り込みハンドラと kthread が同じハードウェア レジスタを使用している場合、このクリティカル セクションをどのように保護できますか?
カーネルのクリティカル セクションは、多くの場合、スピン ロックで保護されています。
ただし、排他ロックは待ち時間を増やし、システムの応答性を低下させる可能性があります。
優れたシステム設計では、(不必要な) クリティカル セクションの作成を回避します。デバイス レジスタへのアクセスが割り込みレベルとタスク レベルに分けられた場合、予備的に使用される 1 つのスピン ロックだけが必要になるでしょう。
そのため、1 つの kthread、割り込みハンドラー、およびシステム コールを Linux ドライバーに関連付けることができますが、必ずしも指定した方法とは限りません。
補遺
しかし、私の場合、ドライバーからデータを送受信するために mmap システム コールを使用することを楽しみにしています。
use の意味を明確にする必要がありますmmap
。ターゲットの SPI デバイス (SD カードやフラッシュ メモリなど) にあるファイルに移動する場合、ファイルシステムまたは MTD レイヤーが「マッピング」を処理し、デバイス ドライバーは単に通常の読み取りと読み取りを実行します
。mmap()
書き込み操作。
割り込みハンドラーでデータ パケットを受信すると、マップされた領域に直接送信できませんか? (あなたの提案は--下半分のタスクレットは受信データに適している可能性があります)
ターゲット SPI デバイスがパケットを送受信する通信デバイスである場合、プログラムはおそらくmmap()
そのデータのバッファを作成できません。このmmap()
機能は、仮想メモリ機能を巧妙に転用したものです。テキストとデータをバッキング ストア (スワップ領域) との間でスワップする代わりに、ユーザー空間メモリに表示される特定のファイルに対して仮想メモリ機能が使用されます。すべてのデバイスは「ファイル」として表されますが、デバイス ファイルはstat()
おそらくmmap()
. できるかもしれませんが (転送が限られている場合)、試したことはありません。
ドライバーのfops mmap()
機能について言及している場合、それは私の理解を超えています。実際、Linux ソース ツリーの 1200 を超えるデバイス ドライバーのうち、約 200 のデバイス ドライバーだけがその特定の fopsを実装しているようです。
あなたの提案に従って、DMAを使用してSPIポートからデータを送信します。これを実現するには、このための関数を作成し、関数のアドレスをDMAに伝える必要がありますか?
SPI または SPI コントローラーで接続されているデバイスのドライバーを実装していますか?
SPI を使用するターゲット デバイスの場合は、標準の SPI インターフェイスを介してこれらのSPI ドライバーのいずれかを使用する可能性があります。おそらく次のような関数を使用します
spi_message_init()
spi_message_add_tail()
spi_sync()
I/O 操作を開始および監視します。その相互参照 Web サイトを使用して、他のドライバーでそれらの関数名を検索し、使用例を確認してください。DMA の使用は、SPI ドライバー次第です。
SPI コントローラー用のドライバーを実装している場合は、それらの他の SPI ドライバーを例として使用してください。
I/O とドライバーの概念をフラットに捉えているように見えますが、Linux の機能は個別のレイヤーに実装されています。
また、コピー操作を避けようとしているようです。「コンピューティング」では、データのバッファリングとコピーがたくさんあります。多くの場合、あるバッファーから別のバッファーにデータをコピーすることは、トリッキーな問題 (保護されたメモリと保護されていないメモリなど) に対する最も簡単な解決策です。
補遺2
おそらく、既存の高性能 MCP2515 CAN ドライバと WCCD フレームワークを見直して、SocketCANを置き換える必要があります。著者は、ISR を最適化し、重要な領域とそのロックの使用を最小限に抑えることにより、パフォーマンスが大幅に向上したことを文書化しています。