int mod_timer(struct timer_list *timer, unsigned long expires);
struct list_head list;
对于smp系统,删除timer最好使用下面的函数来防止冲突:
timer的操作:
为判断时间的先后,内核中定义了以下宏来判断:
function:到期函数,时间到期时调用的函数
通常用法:
};
unsi数据结构学习内容gned long expires;
3. 定时器(timer)
#define time_before_eq(a,b) time_after_eq(b,a)
/* include/linux/timer.h */
struct timer_list通常作为数据结构中的一个参数,在初始化结构的时候初始化timer,表示到期时要进行的操作,实现定时动作,通常更多的是作为超时处理的,timer函数作为超时时的资源释放函数
linux内核定时器由以下结构描述:
data:传给到期函数的数据,实际应用中通常是一个指针转化而来,该指针指向一个结构
修改timer,修改timer的到期时间:
list:timer链表
struct timer数据结构核心技术_list {
extern int del_timer_sync(struct timer_list * timer);
删除timer,将timer从系统timer链表中拆除:
(del_timer()函数可能会失败,这是因为该timer本来已经不在系统timer链表中了,也就是已经删除过了)
(:admin)
unsigned long data;
增加timer,将timer挂接到系统的timer链表:
expires:到期时间
extern void add_timer(struct timer_list * timer);
extern int del_timer(struct timer_list * timer);
这里用到了数据结构是什么课程一个技巧,由于linux中的时间是无符号数,这里先将其转换为有符号数后再判断,就能解决时间回绕问题,当然只是一次回绕,回绕两次当然是判断不出来的,具体可自己实验体会
#define time_after(a,b) ((long)(b) - (long)(a) = 0)
void (*function)(unsigned long);