2

hrtimer に関するこのチュートリアルを見つけました: http://www.ibm.com/developerworks/linux/library/l-timers-list/

私はそれが使用する方法がコールバック ハンドラーを hardirq コンテキストで実行すると信じていますよね? しかし、「興味深い側面の1つは、コールバック関数の実行コンテキストを定義できることです(softirqまたはhardiirqコンテキストなど)

hrtimer.h ファイルを確認しましたが、それほど直感的ではありません。softirq コンテキストで実行する方法を知っている人はいますか? hardirqで実行するのは似ていますか?

ありがとう、

4

1 に答える 1

3

この情報は古いカーネルに関するものです。最近のリリースでは、コードの複雑さを軽減し、バグを回避するために、この機能は削除されています。現在、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上記の例では、modetimeを適切な値に置き換える必要があります。

コールバックにデータを渡したい場合は、tasklet_hrtimer 変数を自分の構造体に埋め込み、container_of トリックを使用してデータを取得する必要があります。

どうやら、構造体には hrtimer 構造体を含む tasklet_hrtimer が含まれます。最も内側の要素へのポインターを取得し、親要素からの固定オフセットがあることがわかっている場合は、親に到達できます。

于 2013-05-14T21:40:00.153 に答える