0

Linuxタイマーを作成するモジュールがありますが、そのうちのいくつかは、ハンドラー関数中に再び追加される可能性があります。

他の場合では、 を使用してタイマーが削除されます (おそらく、タイマーが切れる前に) del_timer_sync()

init_timer()その場合、次の前に構造体で再度呼び出しを行う必要がありadd_timer(ますか?それとも (貴重な) 割り込みレイテンシの無駄ですか?

4

1 に答える 1

2

私自身の質問に答えるために、構造体に再度アクセスするつもりなら、del_timer() または del_timer_sync() の後で構造体を init_timer() する必要があると思います。たとえば、モジュールのクリーンアップ中に timer_pending() などを実行する場合.

タイマーを再利用する可能性のあるカーネルモジュールを作成する場合、最善の方法は次のとおりです。

static struct timer_list my_timer;

...

static void remove_my_timer(void)
{
  if (timer_pending(&my_timer))
  {
    del_timer_sync(&my_timer);
    init_timer(&my_timer);
  }
}

static void arm_my_timer(...)
{
  remove_my_timer();
  my_timer.expires  = ...;
  my_timer.data     = ...;
  my_timer.function = ...;
  add_timer(&my_timer);
}

...

int __init init_my_device(void)
{
  ...
  init_timer(&my_timer);
  ...
}

void __exit cleanup_my_device(void)
{
  ...
  remove_my_timer();
  ...
}

将来、他の誰かに役立つことを願っています。

于 2013-11-15T11:31:16.427 に答える