4

ワークキューの優先度を設定できますか?

ハードウェアとより高速に通信できるように、SPI カーネル モジュール「spidev」を変更しています。外部ハードウェアは非常に小さなバッファーを持つ CAN コントローラーであるため、データの損失を避けるために受信データをすばやく読み取る必要があります。新しいデータを通知するために GPIO 割り込みを構成しましたが、割り込みハンドラーで SPI ハードウェアを読み取ることができません。私の割り込みハンドラーは基本的に、SPI データを読み取るワークキューをセットアップします。カーネルにアクティブなプロセスが 1 つしかない場合は、問題なく動作します。他のプロセス (プロセス ビューアーのトップを含む) を同時に開くとすぐに、データの束が失われ始めます。つまり、1000 パケットのデータを問題なく受信し、その後 15 パケットを続けて失う可能性があります。 . 私の問題の原因は、他のプロセス (トップ、この場合) は、割り込みハンドラーが実行する CPU を制御しますが、スケジューラが再度呼び出されるまで、ワークキュー内の作業は制御されません。プロセスの優先度を上げようとしましたが、成功しませんでした。

割り込み処理関数の直後にワークキュー内の作業を実行するようにカーネルに指示する方法はあるのだろうか。提案は大歓迎です。

4

1 に答える 1

1

別の方法として、タスクレットの使用を検討することもできます。これにより、カーネルがより迅速に実行されるようになりますが、タスクレットではスリープできないことに注意してください。

カーネルでの作業の延期に関する優れた IBM の記事

http://www.ibm.com/developerworks/linux/library/l-tasklets/

http://www.makelinux.net/ldd3/chp-7-sect-5

タスクレットは、CPU がプロセスの実行でビジー状態である限り、次のタイマー ティックで実行されますが、CPU がアイドル状態の場合はすぐに実行されます。カーネルは、tasklet_action 関数などの「ソフト割り込み」ハンドラーを実行するためだけに、CPU ごとに 1 つの ksoftirqd カーネル スレッドのセットを提供します。したがって、タスクレットの最後の 3 回の実行は、CPU 0 に関連付けられた ksoftirqd カーネル スレッドのコンテキストで行われます。

于 2013-05-02T12:00:58.873 に答える