文章目录
  1. 1. 前提概念
  2. 2. 使用步骤
  3. 3. 代码示例
  4. 4. 运行结果

前提概念

HZ:节拍率.linux一秒钟中断的次数,一般是100
jiffies:系统从启动到当前的节拍数。如果系统启动n秒了,则 jiffies = n*HZ

头文件:linux/timer.h

1
2
3
4
5
6
7
8
struct timer_list{
struct list_head entry;
unsigned long expires;
struct tvec_base *base;
void (*function) (unsigned long);
unsigned long data;
.......
}

使用步骤

  1. 申请timer_list结构体 struct timer_list mytimer
  2. 初始化定时器init_timer(&mytimer)
  3. 设置超时间隔,超时函数及其参数。
  4. 编写超时后处理函数
  5. 添加定时器add_timer(&mytimer)
  6. 最终删除定时器del_timer_sync(&mytimer),该函数多处理器安全。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/sched.h>
#include <linux/jiffies.h>
MODULE_LICENSE("Dual BSD/GPL");

struct timer_list mytimer;
int counter = 0;
static void mytimer_handler(unsigned long data)
{

printk("counter now:%d.\n",counter);
counter ++;
if (counter >20)
counter = 0;
mod_timer(&mytimer,jiffies + HZ);
}


static int __init mytimer_init(void)
{

printk("In function:%s\n",__func__);
init_timer(&mytimer);
mytimer.expires = jiffies + HZ;
mytimer.data = jiffies;
mytimer.function = mytimer_handler;
add_timer(&mytimer);
return 0;
}

static void __exit mytimer_exit(void)
{

printk("In function:%s\n",__func__);
del_timer(&mytimer);
}

module_init(mytimer_init);
module_exit(mytimer_exit);

程序中,每经过1秒定时器超时,count值加1并打印出来,然后mod_timer()修改定时器mytimer的expires值为再过1秒超时,再次激活定时器。

运行结果

每隔一秒输出count值,count循环从0增加到20,直到手动卸载模块时,定时器被删除。

文章目录
  1. 1. 前提概念
  2. 2. 使用步骤
  3. 3. 代码示例
  4. 4. 运行结果