被文章摘自一下几位网友。非常感谢他们。

http://blog.sina.com.cn/s/blog_57330c3401011cq3.html

Linux的内核中定义了一个定时器的结构:

#include<linux/timer.h>

struct timer_list

{

struct list_head list;

  unsigned long expires; //定时器到期时间

  unsigned long data; //作为参数被传入定时器处理函数

  void (*function)(unsigned long);

};

利用这个结构我们可以在驱动中很方便的使用定时器。

一: timer的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);

二:使用定时器的一般流程为:

(1)创建timer、编写超时定时器处理函数function;

(2)为timer的expires、data、function赋值;

(3)调用add_timer将timer加入列表----添加一个定时器;

(4)在定时器到期时,function被执行;

(5)在程序中涉及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);
} static int __init hello_init (void)
{
printk("hello,world\n");
init_timer(&mytimer); //初始化定时器
mytimer.expires = jiffies+;//设定超时时间,100代表1秒
mytimer.data = ; //传递给定时器超时函数的值
mytimer.function = mytimer_ok;//设置定时器超时函数
add_timer(&mytimer); //添加定时器,定时器开始生效
return ;
} 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.ko

可以发现过一秒后定时器过期函数被执行了,打印出了信息,250也被正确传递了。

#rmmod timer.ko

我们也可以用lsmod | grep timer  来查看是否加载了timer驱动。

可以用dmesg | tail -20 查看驱动打印的信息

dmesg -c 清楚信息

五:进一步理解定时器:

在上面的定时器超时函数mytimer_ok(unsigned long arg)中,添加如下代码:

mytimer.expires = jiffies+100;//设定超时时间,100代表1秒

mytimer.function = mytimer_ok;//设置定时器超时函数

add_timer(&mytimer); //添加定时器,定时器开始生效

交叉编译后,放到开发板上

#insmod timer.o

发现每隔一秒,mytimer_ok函数就执行一次,这是因为每次定时器到期后,都

又重新给它设置了一个新的超时时间,并且新的超时函数指向自己,形成一个递

归,所以就会一直执行下去。

#rmmod timer

可以卸载模块,当然打印也就结束了,注意因为定时器超时函数不停的打印信息

,导致输入上面的命令时会被定时器超时函数不停的打印信息淹没,不用管他,

耐心的把上面的命令输完就可以成功卸载。

最新文章

  1. Git bash使用中...
  2. asp.net页面间传值方式
  3. Keepalived安装使用详解
  4. Atomic
  5. IOS5基础教程之一-----如何创建XCode项目
  6. source insight 里编辑的时候,每次粘贴后,光标停留在粘贴内容的左面
  7. ReentrantLock类的基本结构
  8. ASP.NET 5是如何通过XRE实现跨平台的
  9. 20165223 《信息安全系统设计基础》 实现mybash
  10. jquery的on()用法实例
  11. OO随笔
  12. 学习python 检测字符串的方法
  13. POJ 3461 Oulipo(模式串在主串中出现次数 可重叠)
  14. Windows 2019 激活教程
  15. 这个网页用到了什么技术,&lt;script&gt;标签,还有双大括号{{}}是什么意思
  16. highmaps如何自定义 区间的颜色刻度
  17. HDU 4990 Reading comprehension 简单矩阵快速幂
  18. 04_java之基本语法02
  19. 初步学习React Router 4.0
  20. JQuery实现动态生成树形菜单

热门文章

  1. js判断字符串中是否包含特殊字符、中文
  2. 第二节:Centos下安装Tomcat8.5.57
  3. 启动扫描闪退,因为忘了在manifest里申请手机镜头使用许可了。
  4. python基础--迭代器、生成器
  5. parted分区
  6. 第十二章 类加载器&amp;反射
  7. Fortify Audit Workbench 笔记 Privacy Violation: Heap Inspection 隐私泄露(堆检查)
  8. (一)python 格式化 excel 格式
  9. PHP fileperms() 函数
  10. [转] 总结了N个真实线上故障