版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/windsnow1/article/details/88291132
在理解Linux内核定时器之前,我们首先需要理解几个内核定时器变量,分别是jiffies、HZ。
jiffies:中文意思是瞬间,瞬息。在<linux/jeffies.h>中声明,该变量记录的是系统启动以来,系统产生的总节拍数,该变量在系统启动的时候被初始化为0,接下来每进行一次时钟中断,jiffies自动加1。
HZ:系统定时器能以可编程的频率来中断处理器,此频率即为每秒的定时器节拍数,对应着内核变量HZ。
定时器管理的结构体:timer_list,在<linux/timer.h>中声明
struct timer_list {
/*
* All fields that change during normal runtime grouped to the
* same cacheline
*/
struct hlist_node entry;
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
u32 flags;
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
//entry:是定时器链表的头结点,每一个定时器都添加到该链表中。【自己的理解】
//expires:记录的是定时器到期的时间。
//function:定时器到期的处理函数,data则是传入function的参数。
定时器操作:
void init_timer(struct timer_list *timer) | 初始化定时器函数,其他初始化函数TIMER_INITIALIZER、DEFINE_TIMER、setup_timer() |
void add_timer(struct timer_list *timer) | 注册内核定时器,加入到内核动态定时器链表中。 |
int del_timer(struct timer_list *timer) | 删除定时器,其他删除函数del_timer_syns,删除定时器时需等待其被处理完。 |
int mod_timer(struct timer_list *timer, unsigned long expires) | 修改定时器到期时间,在新的被传入的expires到来后才会执行定时器函数。 |
以上是自己对内核定时器的总结和理解,若有疑惑,欢迎大家一起交流,批评指正。