0

単一のタスクレット関数によって処理される多くの割り込みがある Linux ドライバーがあります。

それらすべてに同じタスクレットを登録したいのですが、受信したirqに応じて動作を変更します。これはできますか?

あなたが知っている代替ソリューションはありますか?

DECLARE_TASKLET()値が静的であり、irq ハンドラーによって渡されないため、これが機能しないことがわかっている間は、パラメーターを宣言することを提案しないでください。

4

1 に答える 1

1

ワークキューを使用してこれを解決しました。

各割り込みハンドラは、データ構造の異なるインスタンス (request_irq() で登録されたもの) を受け取ります。

この構造体には、そのフィールドの 1 つとして work_struct が含まれています。

irq ごとに複数の work_structs を定義します。

irq ハンドラから INIT_WORK() を呼び出して workqueue 関数を呼び出し、元の構造体の一部である作業構造体フィールドを引数として渡します。

ワークキュー関数は次に使用します

container_of(work_struct_ptr, struct your_original_struct, work_struct_fieldname);

その特定のワークキュー呼び出しのデータのインスタンスを取得します。

結論として、この方法では、複数の割り込みラインを使用でき、同じ割り込みハンドラー、同じワークキュー関数によって処理されますが、異なるデータ構造で作業できます。

お役に立てれば。

于 2014-03-05T20:09:42.037 に答える