内核计时器代码例子
2021-01-24, updated 2021-09-12
Makefile编写
obj-m+=timer_test.o
#SRC="/lib/modules/$(shell uname -r)/build/"
CROSS_COMPILE="/home/bmduser10/develop/realtek/R810/rtl819x/toolchain/msdk-4.4.7-mips-EL-3.10-u0.9.33-m32t-140827/bin/mips-linux"
SRC="/home/bmduser10/develop/realtek/R810/rtl819x/linux-3.10"
all:
make -C $(SRC) M=$(PWD) modules
clean:
make -C $(SRC) M=$(PWD) clean
计时器相关结构体
struct timer_list {
/*
* All fields that change during normal runtime grouped to the
* same cacheline
*/
struct list_head entry;
unsigned long expires;
struct tvec_base *base;
void (*function)(unsigned long);
unsigned long data;
int slack;
#ifdef CONFIG_TIMER_STATS
int start_pid;
void *start_site;
char start_comm[16];
#endif
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
相关api
初始化定时器:
void init_timer(struct timer_list * timer);
增加定时器,重复调用会挂掉:
void add_timer(struct timer_list * timer);
删除定时器:
int del_timer(struct timer_list * timer);
修改定时器的expire:
int mod_timer(struct timer_list *timer, unsigned long expires);
计时器使用
- 创建timer、编写超时定时器处理函数function;
- 为timer的expires、data、function赋值;
- 调用add_timer将timer加入列表—-添加一个定时器;
- 在定时器到期时,function被执行;
- 在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。
示例
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>//jiffies在此头文件中定义
#include <linux/init.h>
#include <linux/timer.h>
struct timer_list mytimer;//定义一个定时器
void mytimer_ok(unsigned long arg)
{
printk("Mytimer is ok\n");
printk("receive data from timer: %d\n",arg);
// 修改定时器
mytimer.expires = jiffies+1*HZ;//设定超时时间,100代表1秒
mytimer.data = 250; //传递给定时器超时函数的值
mytimer.function = mytimer_ok;//设置定时器超时函数
mod_timer(&mytimer); //添加定时器,定时器开始生效
}
static int __init hello_init (void)
{
printk("hello,world\n");
init_timer(&mytimer); //初始化定时器
mytimer.expires = jiffies+1*HZ;//设定超时时间,100代表1秒
mytimer.data = 250; //传递给定时器超时函数的值
mytimer.function = mytimer_ok;//设置定时器超时函数
add_timer(&mytimer); //添加定时器,定时器开始生效
return 0;
}
static void __exit hello_exit (void)
{
del_timer(&mytimer);//卸载模块时,删除定时器
printk("Hello module exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("CXF");
MODULE_LICENSE("Dual BSD/GPL");