内核定时器的调度函数运行过一次后自动注销,但可以通过在被调度的函数中重新调度自己来周期运行。
定义时初始化 该宏会定义一个名叫 timer_name 内核定时器,并初始化其 function, expires, name 和 base 字段,由于在定义时初始化,初始化值不能有变量。 DEFINE_TIMER(timer_name, function_name, expires_value, data); 先定义后初始化 struct timer_list mytimer; setup_timer(&mytimer, (*function)(unsigned long), unsigned long data); mytimer.expires = jiffies + 5*HZ; add_timer(struct timer_list *timer)
add_timer可以使定时器连接到内核定时链表中去,如果在链表内那么timer_pending会返回真 static inline void add_timer(struct timer_list *timer) { BUG_ON(timer_pending(timer)); __mod_timer(timer, timer->expires); } 要修改一个定时器的调度时间,如果修改的定时上次定时还没到返回1否则返回0。 int mod_timer(struct timer_list *timer, unsigned long expires) mod_timer(timer, expires) is equivalent to:del_timer(timer); timer->expires = expires; add_timer(timer); 可见mod_timer可以替换add_timer,在多线程使用同一timer时,最好使用mod_timer,使用add_timer可能会报告BUG。 注销一个定时器,其中 del_timer_sync 是用在 SMP 系统上的(在非SMP系统上,它等于del_timer)要被注销的定时器函数正在另一个 cpu 上运行时,del_timer_sync() 会等待其运行完,所以这个函数会休眠。另外还应避免它和被调度的函数争用同一个锁。对于一个已经被运行过且没有重新注册自己的定时器而言,注销函数其实也没什么事可做。 del_timer(struct timer_list *timer) ; del_timer_sync(struct timer_list *timer); 这个函数用来判断一个定时器是否被添加到了内核链表中以等待被调度运行。注意,当一个定时器函数即将要被运行前,内核会把相应的定时器从内核链表中删除(相当于注销)这样定时器函数就可以重新注册自己。 int timer_pending(const struct timer_list *timer);