【linux内核】linux内核定时器

linux内核定时器

代码位置:kernel/time/timer.c

函数原型:

int mod_timer(struct timer_list *timer, unsigned long expires);

功能:修改已有定时器的到期时间。如果定时器已经在运行,它会重新设置到期时间;如果定时器未在运行,它会启动这个定时器。

返回值:

  • 如果定时器之前已经在激活状态,则返回非零(true)。
  • 如果定时器之前没有激活,则返回 0(false)。

 

[初始化定时器]
        |
        v
  timer_setup(&timer, callback)
        |
        v
+----------------+
| 定时器未激活   |
+----------------+
        |
        | add_timer(&timer) / mod_timer(&timer, jiffies + X)
        v
+----------------+
| 定时器激活     |
+----------------+
        |
        | 到期时间到 (expires)
        v
+----------------+
| 执行 callback  |
+----------------+
        |
        | 若需要再次触发,可再次调用 mod_timer()
        v
[循环或结束]
        |
        | del_timer_sync(&timer)
        v
+----------------+
| 定时器已删除   |
+----------------+

 

from_timer 是 Linux 内核里处理 定时器回调时获取宿主结构指针 的一个辅助宏,常用于从 struct timer_list 指针中反向得到包含它的结构体。定义在内核头文件 linux/timer.h:

#define from_timer(var, callback_timer, timer_fieldname) \
    container_of(callback_timer, typeof(*var), timer_fieldname)

 

实例:

struct my_data {
    int value;
    struct timer_list timer;
};

void my_timer_callback(struct timer_list *t)
{
    struct my_data *data = from_timer(data, t, timer);
    // do something with data
}

void init_timer_example(struct my_data *data)
{
    timer_setup(&data->timer, my_timer_callback, 0);
    mod_timer(&data->timer, jiffies + HZ);  // 1 second later
}

参考资料

 

posted @ 2019-02-20 16:04  苏格拉底的落泪  阅读(374)  评论(0)    收藏  举报