设为首页 收藏本站
查看: 1167|回复: 0

[经验分享] linux timer

[复制链接]

尚未签到

发表于 2019-2-18 08:54:28 | 显示全部楼层 |阅读模式
  Linux的内核中定义了一个定时器的结构:
  #include
  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 #include #include #include //jiffies在此头文件中定义#include #include 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;//设定超时时间,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");

  四:交叉编译后,放到开发板上:
  #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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-673771-1-1.html 上篇帖子: Linux 20180411 cp命令等 下篇帖子: linux 的 DNS 和 bind
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表