1、内核定时器简介
Linux内核定时器使用很简单,只须要提供超时时间(相当于定时值)和定时处理函数即可,当超时时间到了之后设置的定时处理函数都会执行,和我们使用硬件定时器的套路一样,只是使用内核定时器不须要做一大堆的寄存器初始化工作。在使用内核定时器的时侯要注意一点,内核定时器并不是周期性运行的,超时之后才会手动关掉,因而假如想要实现周期性定时linux 内核 定时器,这么就须要在定时处理函数中重新开启定时器。
Linux内核使用timer_list结构体表示内核定时器,timer_list定义在文件include/linux/timer.h中,定义如下(省略掉条件编译):
要使用内核定时器首先要先定义一个timer_list变量,表示定时器,tiemr_list结构体的expires成员变量表示超时时间,单位为节拍数。例如我们如今须要定义一个周期为2秒的定时器,这么这个定时器的超时时间就是jiffies+(2HZ),因而expires=jiffies+(2HZ)。function就是定时器超时之后的定时处理函数,我们要做的工作就放在这个函数上面linux 内核 定时器,须要我们编撰这个定时处理函数。
定义好定时器之后还须要通过一系列的API函数来初始化此定时器,这种函数如下:
1、init_timer函数
init_timer函数负责初始化timer_list类型变量linux培训机构,当我们定义了一个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函数用于删掉一个定时器,不管定时器有没有被**,都可以使用此函数删掉。在多处理器系统上,定时器可能会在其他的处理器上运行手机linux操作系统,因而在调用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);
}