Linux内核定时器理解及编程使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 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到来后才会执行定时器函数。

以上是自己对内核定时器的总结和理解,若有疑惑,欢迎大家一起交流,批评指正。

猜你喜欢

转载自blog.csdn.net/windsnow1/article/details/88291132