Linux デバイスドライバで workqueue を使用する方法
Linuxデバイスドライバにおけるworkqueueとは、タスク遂行を遅延させられるメカニズムです。カーネルにより提供される一種のジョブキューであり、それにより、現在のプロセスやスレッドをブロックすることなく、いくつかの遅延処理が必要なタスクをバックグラウンドで実行できます。
ワークキューを使用するには、以下の手順に従う必要があります。
- デバイスドライバの構造体内に定義される、実行する作業を記述するためのwork_struct 構造体を定義する。
struct work_struct my_work;
- ワーカーキュー内で実行されるジョブの処理関数を定義します。
static void my_work_handler(struct work_struct *work)
{
// 处理工作任务
}
- 初期化処理キューで、機器ドライバの初期化関数でINIT_WORKマクロを呼び出すことで初期化処理キューを初期化します。
INIT_WORK(&my_work, my_work_handler);
- タスクをジョブキューにサブミットすることは、schedule_work または schedule_work_on 関数を呼び出すことで実現できます。
schedule_work(&my_work);
- 最後に、処理キューのワークをキャンセルして未処理の作業タスクがないよう、デバイスドライバの終了関数内で処理キューの登録を解除してください。
cancel_work_sync(&my_work);
ワークキューの基本的な使い方は以上です。ワークキューで実行するタスクは通常、デバイスの読み書きや割り込みの処理など、時間がかかる操作です。ワークキューはこれらの操作をバックグラウンドで行うことができ、現在のプロセスやスレッドをブロックしません。