Linux
タイマーを作成するモジュールがありますが、そのうちのいくつかは、ハンドラー関数中に再び追加される可能性があります。
他の場合では、 を使用してタイマーが削除されます (おそらく、タイマーが切れる前に) del_timer_sync()
。
init_timer()
その場合、次の前に構造体で再度呼び出しを行う必要がありadd_timer(
ますか?それとも (貴重な) 割り込みレイテンシの無駄ですか?
私自身の質問に答えるために、構造体に再度アクセスするつもりなら、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();
...
}
将来、他の誰かに役立つことを願っています。