• Linux 驱动之内核定时器


    1、定时器

    之前说过两类跟时间相关的内核结构。

    1、延时:通过忙等待或者睡眠机制实现延时。

    2tasklet和工作队列,通过某种机制使工作推后运行,但不知道运行的详细时间。

    接下来要介绍的定时器,可以使工作在指定的时间点上运行。并且不须要使用忙等待这类的延时方法。

    通过定义一个定时器,告之内核在哪个时间须要运行什么函数就行了。等时间一到,内核会就运行指定的函数。

    2、使用定时器

    定时器的使用非常easy,仅仅须要三部:

    1、定义定时器结构体timer_list

    2、设置超时时间,定义定时器处理函数和传參。

    3、激活定时器


    代码

    #include <linux/module.h>
    #include <linux/init.h>
    
    #include <linux/sched.h>
    #include <linux/timer.h>
    
    #if 0  //定义并初始化定时器结构体timer_list。
    /*include/linux/timer.h*/
    struct timer_list {
    	struct list_head entry;
    	unsigned long expires; //设置在运行定时器处理函数的时间
    
    	void (*function)(unsigned long); //定时器处理函数
    	unsigned long data; //处理函数的传參
    
    	struct tvec_base *base;
    	
    	#ifdef CONFIG_TIMER_STATS
    		void *start_site;
    		char start_comm[16];
    		int start_pid;
    	#endif
    	
    };
    #endif
    
    struct timer_list my_timer; //1.定义定时器结构体timer_list
    
    void timer_func(unsigned long data) //2.定义定时器处理函数
    {
    	printk("time out![%d] [%s]
    ", (int)data, current->comm); //打印当前进程
    }
    
    static int __init test_init(void) //模块初始化函数
    {
    	 init_timer(&my_timer); //1.初始化timer_list结构
    
    	 my_timer.expires = jiffies + 5*HZ; //2.设定定时器处理函数触发时间为5秒
    	 my_timer.function = timer_func; //2.给结构体指定定时器处理函数
    	 my_timer.data = (unsigned long)99; //2.设定定时器处理函数的传參
    
    	 add_timer(&my_timer); //3.激活定时器
    	 printk("hello timer,current->comm[%s]
    ", current->comm);
    	 return 0;
     }
    
    static void __exit test_exit(void) //模块卸载函数
    {
    	printk("good bye timer
    ");
    }

    三、定时器的删除和改动


    上面说了。激活定时器后仅仅能运行一遍。假设要实现隔指定时间又反复运行,那就要改动一下代码。

    在定时器处理函数中加上两条代码:

    my_timer.expires = jiffies + 2*HZ; //又一次设定时间,在两秒后再运行

    add_timer(&my_timer); //再次激活定时器

    这种话,每一个2秒就会再次运行定时器处理函数。

    这两条代码也相当与一下的函数:


     mod_timer(&my_timer, jiffies + 2*HZ);


    /*kernel/timer.c*/

    int mod_timer(struct timer_list *timer, unsigned long expires)

    这是改变定时器超时时间的函数,假设在指定的定时器(timer)没超时前调用,超时时间会更新为新的新的超时时间(expires)。假设在定时器超时后调用。那就相当于又一次指定超时时间并再次激活定时器。


    假设想在定时器没有超时前取消定时器,能够调用下面函数:

    /*kernel/timer.c*/

     int del_timer(struct timer_list *timer)

    该函数用来删除还没超时的定时器。



  • 相关阅读:
    Flink 双流合并之connect Demo2
    Flink 双流合并之connect Demo1
    Flink 双流合并Join
    Flink状态保存CheckPoint
    Flink状态之OperatorState
    Flink状态之AggregateState
    Flink状态之ReduceState
    Flink状态之MapState
    Flink状态之KeyedListState
    大数据框架环境安装与配置01--服务器基本设置
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6743755.html
Copyright © 2020-2023  润新知