济南网站建设小程序,平面广告设计论文,免费空间访客,网站安全管理制度建设我的内核是2.4.18的。Linux的内核中定义了一个定时器的结构#xff1a;
#includelinux/timer.h
struct timer_list { structlist_head list;
unsigned long expires; //定时器到期时间
unsigned long data; //作为参数被传入定时器处理函数
void (*function)(uns…我的内核是2.4.18的。Linux的内核中定义了一个定时器的结构
#includelinux/timer.h
struct timer_list { structlist_head list;
unsigned long expires; //定时器到期时间
unsigned long data; //作为参数被传入定时器处理函数
void (*function)(unsigned long);
};
利用这个结构我们可以在驱动中很方便的使用定时器。
一 timer的API函数 初始化定时器 voidinit_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, unsignedlong expires); 二使用定时器的一般流程为
1创建timer、编写超时定时器处理函数function
2为timer的expires、data、function赋值
3调用add_timer将timer加入列表
4在定时器到期时function被执行
5在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。 #includelinux/module.h
#include linux/kernel.h
#include linux/init.h
#includelinux/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); } static int __init hello_init (void)
{ printk(hello,world\n); init_timer(mytimer); //初始化定时器 mytimer.expires jiffies100;//设定超时时间100代表1秒 mytimer.data 250; //传递给定时器超时函数的值 mytimer.function mytimer_ok;//设置定时器超时函数 add_timer(mytimer); //添加定时器定时器开始生效 return0;
} 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);
四交叉编译后放到开发板上
#insmod timer.o
可以发现过一秒后定时器过期函数被执行了打印出了信息250也被正确传递
了呵呵
#rmmod timer 实验完成。
五进一步理解定时器 在上面的定时器超时函数mytimer_ok(unsigned long arg)中添加如下
代码
mytimer.expires jiffies100;//设定超时时间100代表1秒 mytimer.function mytimer_ok;//设置定时器超时函数
add_timer(mytimer); //添加定时器定时器开始生效
交叉编译后放到开发板上
#insmod timer.o 发现每隔一秒mytimer_ok函数就执行一次这是因为每次定时器到期后都
又重新给它设置了一个新的超时时间并且新的超时函数指向自己形成一个递
归所以就会一直执行下去。 #rmmod timer
可以卸载模块当然打印也就结束了注意因为定时器超时函数不停的打印信息
导致输入上面的命令时会被定时器超时函数不停的打印信息淹没不用管他 耐心的把上面的命令输完就可以成功卸载。