欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux内核定时器介绍以及定时器操作函数集合

程序员文章站 2022-06-09 11:35:52
...

1、内核定时器简介

Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。

Linux 内核使用 timer_list 结构体表示内核定时器,timer_list 定义在文件include/linux/timer.h 中,定义如下(省略掉条件编译):
Linux内核定时器介绍以及定时器操作函数集合
要使用内核定时器首先要先定义一个 timer_list 变量,表示定时器, tiemr_list 结构体的expires 成员变量表示超时时间,单位为节拍数。比如我们现在需要定义一个周期为 2 秒的定时器,那么这个定时器的超时时间就是 jiffies+(2HZ),因此 expires=jiffies+(2HZ)。 function 就是定时器超时以后的定时处理函数,我们要做的工作就放到这个函数里面,需要我们编写这个定时处理函数。

定义好定时器以后还需要通过一系列的 API 函数来初始化此定时器,这些函数如下:

1、 init_timer 函数

init_timer 函数负责初始化 timer_list 类型变量,当我们定义了一个 timer_list 变量以后一定要先用 init_timer 初始化一下。 init_timer 函数原型如下:

void init_timer(struct timer_list *timer)
参数 含义
timer 要初始化定时器

无返回值

2、 add_timer 函数

add_timer 函数用于向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会开始运行,函数原型如下:

void add_timer(struct timer_list *timer)
参数 含义
timer 要注册的定时器

无返回值

3、del_timer 函数

del_timer 函数用于删除一个定时器,不管定时器有没有被**,都可以使用此函数删除。在多处理器系统上,定时器可能会在其他的处理器上运行,因此在调用 del_timer 函数删除定时器之前要先等待其他处理器的定时处理器函数退出。 del_timer 函数原型如下:

int del_timer(struct timer_list * timer)
参数 表格
timer 要删除的定时器。
返回值 含义
0 定时器还没被**
1 定时器已经**

4、 del_timer_sync 函数

del_timer_sync 函数是 del_timer 函数的同步版,会等待其他处理器使用完定时器再删除,del_timer_sync 不能使用在中断上下文中。 del_timer_sync 函数原型如下所示:

int del_timer_sync(struct timer_list *timer)
参数 含义
timer 要删除的定时器
返回值 含义
0 定时器还没被**
1 定时器已经**

5、 mod_timer 函数

mod_timer 函数用于修改定时值,如果定时器还没有**的话, mod_timer 函数会**定时器!函数原型如下:

int mod_timer(struct timer_list *timer, unsigned long expires)
参数 含义
timer 要修改超时时间(定时值)的定时器
expires 修改后的超时时间
返回值 含义
0 调用 mod_timer 函数前定时器未被**
1 调用 mod_timer 函数前定时器已被**

2、内核定时器一般的使用流程

struct timer_list timer; /* 定义定时器 */

/* 定时器回调函数 */
void function(unsigned long arg)
{
	/*
	 * 定时器处理代码
	 */

 	/* 如果需要定时器周期性运行的话就使用 mod_timer
 	* 函数重新设置超时值并且启动定时器。
 	*/
 	mod_timer(&dev->timertest, jiffies + msecs_to_jiffies(2000));

}

/* 初始化函数 */
 void init(void)
 {
 	init_timer(&timer); /* 初始化定时器 */

 	timer.function = function; /* 设置定时处理函数 */
 	timer.expires=jffies + msecs_to_jiffies(2000);/* 超时时间 2 秒 */
	timer.data = (unsigned long)&dev; /* 将设备结构体作为参数 */

 	add_timer(&timer); /* 启动定时器 */
 }

 /* 退出函数 */
 void exit(void)
 {
 	del_timer(&timer); /* 删除定时器 */
 	/* 或者使用 */
 	del_timer_sync(&timer);
 }