1. 定时器
定时器有时也称为动态定时器或内核定时器,是管理内核时间的基础。定时器的使用很简单。你只需要执行一些初始化工作,设置一个超时时间,指定超时发生后执行的函数,然后激活定时器就可以了。
注意,定时器并不是周期运行,它在超时后就自行销毁。
1.1. 使用定时器
定时器由结构timer_list表示,在<linux/timer.h>中:
struct timer_list{
struct list_head entry; /*定时器链表入口*/
unsigned long expires; /*以jiffies单位的定时值*/
spin_lock lock; /*保护定时器的锁/
void (*func)(unsigned long); /* 定时器处理函数*/
unsigned long data; /*参数*/
struct tvec_t_base_s *base; /*定时内部值,用户不要使用*/
};
内核提供了一组接口操作定时器,在<linux/timer.h>中
创建定时器时需要定义它:
struct timer_list my_timer;
接着需要初始化,初始化必须在使用其他定时器管理函数对定时器操作前完成:
init_timer(&my_timer);
my_timer.expires表示超时时间,它是以节拍为单位的绝对计数值。处理函数必须符合下面的函数原型:
void my_timer_fuc(unsigned long data);
data参数使你可以利用同一个处理函数注册多个定时器,只需要通过参数就能区别对待它们。如果不需要参数,可以简单的传递0(或任何其他值)给处理函数。
最后,必须激活定时器:
add_timer(&my_tiner);
现在,只要节拍计数大于或等于指定的超时时,内核就开始执行定时器处理函数。
内核通过函数mod_timer来实现已经激活的定时器超时时间: