この情報は古いカーネルに関するものです。最近のリリースでは、コードの複雑さを軽減し、バグを回避するために、この機能は削除されています。現在、hrtimer は常に、無効な IRQ を使用して hardirq コンテキストで実行されます。
考えられるアプローチの 1 つは、tasklet_hrtimer を使用することです。
#include <linux/interrupt.h>
struct tasklet_hrtimer mytimer;
enum hrtimer_restart callback(struct hrtimer *t) {
struct tasklet_hrtimer *mytime=container_of(t,struct tasklet_hrtimer,timer);
...
}
...
tasklet_hrtimer_init(&mytimer,callback,clock,mode);
tasklet_hrtimer_start(&mytimer,time,mode);
...
clock
上記の例では、mode
とtime
を適切な値に置き換える必要があります。
コールバックにデータを渡したい場合は、tasklet_hrtimer 変数を自分の構造体に埋め込み、container_of トリックを使用してデータを取得する必要があります。
どうやら、構造体には hrtimer 構造体を含む tasklet_hrtimer が含まれます。最も内側の要素へのポインターを取得し、親要素からの固定オフセットがあることがわかっている場合は、親に到達できます。