Linux内核定时器介绍以及定时器操作函数集合
Linux内核定时器介绍
1、内核定时器简介
Linux 内核定时器使用很简单,只需要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不需要做一大堆的寄存器初始化工作。在使用内核定时器的时候要注意一点,内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。
Linux 内核使用 timer_list 结构体表示内核定时器,timer_list 定义在文件include/linux/timer.h 中,定义如下(省略掉条件编译):
要使用内核定时器首先要先定义一个 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);
}