我是靠谱客的博主 典雅盼望,最近开发中收集的这篇文章主要介绍linux内核定时器的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 时钟源
    • 系统节拍设置
    • jiffies和时间之间的转换函数
    • 内核定时器
      • 一般使用流程
      • 其它相关函数

时钟源

应该是generic timer,百度吧

系统节拍设置

在这里插入图片描述
在这里插入图片描述

比如我想定时3s钟,那么就是3*HZ即可。

Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数,系统启动的时候会将 jiffies 初始化为 0,jiffies 定义在文件 include/linux/jiffies.h 中,定义如下:

extern u64 __jiffy_data jiffies_64;  /* 用于64位系统*/
extern unsigned long volatile __jiffy_data jiffies; /* 用于32位系统,49.7天就会溢出 */

Linux 内核提供了如表 50.1.1.1 所示的几个 API 函数来处理绕回(溢出)。在这里插入图片描述

jiffies和时间之间的转换函数

在这里插入图片描述

内核定时器

参看:include/linux/timer.h

Linux 内核使用 timer_list 结构体表示内核定时器,定义如下(省略掉条件编译):

struct timer_list {
    struct list_head entry;
    unsigned long expires; /* 定时器超时时间,单位是节拍数 */
    struct tvec_base *base;
    void (*function)(unsigned long); /* 定时处理函数 */
    unsigned long data; /* 要传递给 function 函数的参数 */
    int slack;
};

一般使用流程

  1. 定义一个定时器struct timer_list mytimer

  2. 初始化定时器void init_timer(struct timer_list *timer)

  3. 向内核添加定时器void add_timer(struct timer_list *timer),这样定时器就会开始运行。

    • 配置定时器

      mytimer.function = function; /* 定时器处理函数*/
      mytimer.expires = jiffies + msecs_to_jiffies(2000); /* 超时时间为2s */
      mytimer.data = (unsigned long)&dev; /* 自己的数据 */
      add_timer(&mytimer); /* 启动定时器 */
      
  4. 删除一个定时器int del_timer(struct timer_list * timer),返回值1->定时器已经激活,0->定时器还没有被激活。

其它相关函数

参看:include/linux/timer.h

extern void add_timer_on(struct timer_list *timer, int cpu);
extern int del_timer(struct timer_list * timer);
extern int mod_timer(struct timer_list *timer, unsigned long expires);
extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires);

extern void set_timer_slack(struct timer_list *time, int slack_hz);

在这里插入图片描述

最后

以上就是典雅盼望为你收集整理的linux内核定时器的使用的全部内容,希望文章能够帮你解决linux内核定时器的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部