0

我有一个Linux创建计时器的模块,其中一些可能会在它们的处理函数中再次添加自己。

在其他一些情况下,使用del_timer_sync().

在这种情况下,我是否需要init_timer()在 next 之前再次对结构进行调用add_timer()或者这只是浪费(宝贵的)中断延迟?

4

1 回答 1

2

为了回答我自己的问题,如果我打算再次访问该结构,我相信我确实需要在任何 del_timer() 或 del_timer_sync() 之后初始化我的结构 - 例如,在执行 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 回答