• Linuxd的内核定时器 timer_list


    1.内核定时器介绍

    ​ 内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数的一种机制,相关函数位于 和 kernel/timer.c 文件中。

    ​ 当内核定时器定时时间到达时,会进入用户指定的函数,相当于软中断。内核定时器注册开启后,运行一次就不会再运行(相当于自动注销),我们可以重新设置定时器的超时时间,让定时器重复运行。

    ​ 每当时钟中断发生时,全局变量jiffies(一个32位的unsigned long 变量)就加1,因此jiffies记录了linux系统启动后时钟中断发生的次数,驱动程序常利用jiffies来计算不同事件间的时间间隔。内核每秒钟将jiffies变量增加HZ次。因此,对于HZ值为100的系统,jiffy+1等于隔了10ms,而对于HZ为1000的系统,jiffy+1仅为1ms。

    内核定时器结构体

     //timer_list-4.15之前版本
    struct timer_list {
        struct list_head entry //定时器列表
    	unsigned long expires; //设置定时器到期时间,用jiffies作为基准值
        struct tvec_base *base//管理检测时间
    	void (*function)(unsigned long); //类似中断服务函数,设置定时器到时后处理的函数 
        unsigned long data; //中断服务函数的参数
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2.内核定时器相关API函数
    //声明结构变量
    struct timer_list mytimer;
    //初始化
    void init_timer(struct timer_list *timer);
    //增加定时器
    void add_timer(struct timer_list *timer)
    //修改定时器expire
    int mod_timer(struct timer_list *timer,unsigned long expire)
    //删除定时器
    int del_timer(struct timer_list *timer)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.1 修改定时器超时时间
    函数原型*int mod_timer(struct timer_list timer, unsigned long expires)
    函数功能修改定时器超时时间
    函数参数timer:对应的定时器结构体 expires:超时时间
    函数返回值成功返回 :修改成功的时间值
    2.2 初始化定时器
    函数原型#define init_timer(timer)
    函数功能初始化定时器结构
    函数参数timer:对应的定时器结构体
    2.3 关闭定时器
    函数原型int del_timer(struct timer_list *timer)
    函数功能关闭定时器,停用一个定时器。
    函数参数timer:对应的定 时器结构体
    函数返回值返回0:成功
    2.4 关闭定时器
    函数原型int del_timer_sync(struct timer_list *timer)
    函数功能关闭定时器,停用一个定时器,多处理器使用。
    函数参数timer:对应的定时器结构体
    函数返回值返回0:成功
    2.5 转换时间(微妙单位)
    函数原型unsigned long usecs_to_jiffies(const unsigned int m)
    函数功能转换时间(微妙单位),用于填充定时器结构体,设置超时时间
    函数参数m:要转换的时间值(微妙为单位)
    函数返回值成功返回转换成功的时间。用于填充定时器结构体,设置超时时间
    2.6 转换时间(毫秒为单位)
    函数原型unsigned long msecs_to_jiffies(const unsigned int m)
    函数功能转换时间(毫秒为单位),用于填充定时器结构体,设置超时时间
    函数参数m:要转换的时间值(毫秒为单位)
    函数返回值成功返回转换成功的时间。用于填充定时器结构体,设置超时时间
    3.使用定时器的步骤
    void callback(unsigned long arg){
        int *strp = (int*)arg
        printf(strp);//输出的是12
        tm.expires = jiffies+1*HZ//重新设置时间
        add_timer(&tm);//再次启动定时器
    }
    (1) 定义定时器结构体timer_list。
    /*定义一个内核定时器配置结构体*/
    static struct timer_list mytimer ; 
    
    (2) 设置超时时间,定义定时器处理函数和传参。
     mytimer.expires=jiffies+ msecs_to_jiffies(1000); /*设置定时器的超时时间,1000毫秒*/
     //mytimer.expires=jiffies+HZ; /*设置定时器的超时时间,1000毫秒*/
     //两者相同
     //mytimer.expires = jiffies(可以理解成当前时间) + 1*HZ   定时时间  1*HZ 一秒钟节拍数量
     //此行可以理解为 当前时间加上1秒钟  一秒钟后到时
    
    mytimer.function = callback;	 /*定时器超时的回调函数,类似中断服务函数*/
    mytimer.data = 12;               /*传给定时器服务函数的参数*/
    (3) 启动定时器
    add_timer(&tm);//启动定时器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    读书笔记:《探索大脑的内部世界》
    ARRI阿莱MXF(ALEXA Mini LF)多碎片重组案例
    本地部署Ollama+qwen本地大语言模型Web交互界面
    企业网络的设计与实施
    外汇天眼:虚假宣传 FCA发出最新警告 远离该平台!
    [附源码]java毕业设计校园闲置物品交易
    互联网跟帖评论有新规,内容审核平台也要加强防范
    表关联查询
    Google Earth Engine(GEE)——sentinel-1数据中乌克兰附近数据缺失轨道36缺失
    【微服务】SpringCloud中Ribbon的WeightedResponseTimeRule策略
  • 原文地址:https://blog.csdn.net/kaszxc/article/details/128053615