下面一段添加一个定时器的代码:
1. timer 的声明如下:
static struct timer_list timer;
timer_list 定义于include/linux/timer.h 中
struct timer_list {
struct list_head entry;
//定时器触发时间
unsigned long expires;
//定时器触发时,执行的函数
void (*function)(unsigned long);
//定时器私有数据,可以用来赋值,传递信息
unsigned long data;
struct tvec_base *base;
#ifdef CONFIG_TIMER_STATS
void *start_site;
char start_comm[16];
int start_pid;
#endif
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
2. 在模块初始化中,添加定时器:
static int demo_map_init(void)
{
int err = 0;
char *kstr;
...
//创建定时器,每隔10秒打印一次被映射的物理内存的内容
//初始化定时器
init_timer(&timer);
//赋值定时器执行函数
timer.function = timer_func;
//赋值定时器私有数据
timer.data = (unsigned long)kstr;
// 赋值定时器触发时间
timer.expires = jiffies + HZ * 10;
// 向内核添加该定时器
add_timer(&timer);
...
}
3. timer_func 函数定义:
//timer function, print mapped physical pages.
static void timer_func(unsigned long data)
{
printk("timer_func: %s\n", (char *)data);
timer.expires = jiffies + HZ * 10;
add_timer(&timer);
}
4. delete timer, 模块卸载时 删除定时器:
static void demo_map_exit(void)
{
//同步从内核中 删除定时器
del_timer_sync(&timer);
cdev_del(pcdev);
unregister_chrdev_region(ndev, 1);
kunmap(pg);
ClearPageReserved(pg);
__free_pages(pg, 0);
}