注意:如果超时了运行超时函数

注意:如果超时了运行超时函数,此时系统是处在时钟中断的bottom half里的,不能进行很复杂的操作,如果要完成一些复杂操作,如到期后的数据发送,不能直接在到期函数中处理,而是应该在到期函数中发个信号给特定内核线程转到top half进行处理

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);

















































































白癜风要注意什么


转载请注明:http://www.92nongye.com/zyjs/103.html