zoukankan      html  css  js  c++  java
  • Linux--内核定时器

    一、时钟中断由系统的定时硬件以周期性的 时间间隔产生(1/HZ秒),这个间隔(频率)由 HZ决定,HZ是一个与硬件体系无关的常数,可配置(50-1200),在X86平台,默认是1000

    每当时钟中断产生时,全局变量 jiffies 就+1,因此 jiffies 记录了自Linux启动后时钟中断发生的次数,驱动程序经常使用 jiffies 来计算 不同事件的时间间隔。

    应用:     延时执行

      如果对延时的精度要求不高,最简单的实现要求如下:-- 忙等待

    unsigned long j = jiffies +jit_delay*HZ;
    while(jiffies < j)
    {
        //do nothing;
    }

    二、内核定时器

      定时器用于控制某个函数(定时器处理函数)在未来某个事件执行,内核定时器注册的函数只执行一次,不是重复执行的。

      一般来说,定时器都在超时后马上就会执行超时处理函数,但是也有可能被推迟到下一个时钟节拍时才能执行,所以不能用定时器来实现任何硬实时任务。

    struct timer_list{
     struct list_head entry; //内核使用,内核定时器被组织成双线链表
     unsigned long exoires; //设定的超时的jiffies值
     void(*function)(unsigned long); //超时处理函数
     unsigned long data; //超时处理函数参数
     struct tvec_base *base; //内核使用
    }

    三、操作

        初始化定时器   init_timer(struct timer_list *timer);

      启动定时器  void add_timer(struct timer_list *timer);

      删除定时器 (在生效前,超时后会自动删除)int del_timer(struct timer_list * timer);

    #include "linux/module.h"
    #include "linux/timer.h"
    #include "linux/jiffies.h"
    
    struct timer_list demo_timer;
    
    static void time_func(unsigned long data)
    {
        printk("%s ,secs = %ld!
    ",(char *)data,jiffies/HZ);
        
        mod_timer(&demo_timer,jiffies + 5*HZ);
    }
    
    static int __init mytimer_init(void)
    {
        printk("mytimer_init!
    ");
        setup_timer(&demo_timer,time_func,(unsigned long) "demo_timer!");
        demo_timer.expires = jiffies + 1*HZ;
        add_timer(&demo_timer);
        
        return 0;
    }
    
    static void __exit mytimer_exit(void)
    {
        printk("mytimer_exit!
    ");
        del_timer(&demo_timer);
    }
    
    module_init(mytimer_init);
    module_exit(mytimer_exit);
    
    MODULE_LICENSE("Dual BSD/GPL");
  • 相关阅读:
    浅析ES6中的iterator
    nodejs中的异步回调机制
    用好js与nodejs中的try...catch
    vscode设置html默认浏览器
    nodejs中相互引用(循环引用)的模块分析
    ES6—带默认值的函数参数及其作用域
    函数声明与函数表达式的区别
    let块级引起的闭包思考
    进程与线程
    angular(^4)-监控表格按键行为的问题
  • 原文地址:https://www.cnblogs.com/hkyst/p/7783729.html
Copyright © 2011-2022 走看看