定时器(动态定时器,内核定时器)是管理内核时间流逝的基础。内核经常需要推后执行某些代码(所谓的下半部机制),因此需要一种机制,使工作在指定的时间点完成,这就是内核定时器的作用与目标。。、
使用原理: 初始化一个定时器,设置超时时间,指定超时发生后的处理函数,激活定时器。。
定时器并不周期性运行,超时后自动撤销(动态)。。。定时器在内核中应用非常普遍。。
定时器结构timer_list,定义在文件<linux/timer.h>
struct timer_list {
struct list_head entry; //定时器链表
unsigned long expires; //超时时间,以jiffies为单位
void (*function)(unsigned long); //超时处理函数
unsigned long data; //超时处理函数传参
struct tvec_base *base;
#ifdef CONFIG_TIMER_STATS
void *start_site;
char start_comm[16];
int start_pid;
#endif
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
内核提供了一组定时器相关的接口,以简化定时器操作,定义在linux/timer.h,实现在kernel/timer.c。。。
struct timer_list my_timer;
init_timer(&my_timer);
自定义超时时间,处理函数等,处理函数原型必须是
data参数使得一个处理函数可以注册多个定时器,通过区分data参数来区别它们。。若不使用这个参数,则简单的传0即可。。
激活定时器 add_timer(&my_timer)
定时器的操作有可能会被推迟到超时后的下一个时钟节拍运行,无法保证硬实时!
修改未被激活的定时器,并激活 mod_timer( ,,)
删除定时器 del_timer();
在多处理器机器上,在删除定时器的时候,可能定时器中断已经在其它处理器上运行了,因此需要等待定时器处理程序退出,采用del_timer_sync()..该函数不能在中断上下文中使用。。(why?)