美文网首页Linux驱动
L13. hrtimer使用实例(高精度定时器)

L13. hrtimer使用实例(高精度定时器)

作者: 开源519 | 来源:发表于2020-08-05 08:46 被阅读0次

1.简介
随着内核不断更新演进,内核对定时器的分辨率要求越来越高。硬件的高速发展也逐渐能够满足内核的这一要求,因此内核针对硬件提供的便利,开始设计了更高分辨率的定时器(hrtimer),可达到ns级别。本文主要讲解如何使用高精度定时器。
更多介绍详见内核文档目录kernel/Documentation/timers/hrtimers.txt

2.数据结构

/**
 * 定时器调用标志位
 */
enum hrtimer_restart {
    HRTIMER_NORESTART,  /* Timer is not restarted */
    HRTIMER_RESTART,    /* Timer must be restarted */
};

/**
 * struct hrtimer - 基本的hrtimer结构
 * @node:        timerqueue节点,
 * @_softexpires:hrtimer的绝对最早到期时间。
 * @function:    计时器到期回调函数
 * @base:        指向计时器基础的指针(每个cpu和每个时钟)
 * @state:       状态信息(请参见上面的位值)
 * @is_rel:      设置计时器
 * @start_pid:   计时器统计信息字段,用于存储任务的pid
 * @start_site:  计时器统计信息字段,用于存储计时器所在的站点
 * @start_comm:  计时器统计信息字段,用于存储其中的进程名称
 *
 * hrtimer结构必须由hrtimer_init()初始化
 */
struct hrtimer {
    struct timerqueue_node     node;
    ktime_t                    _softexpires;
    enum hrtimer_restart       (*function)(struct hrtimer *);
    struct hrtimer_clock_base  *base;
    u8              state;
    u8              is_rel;
#ifdef CONFIG_TIMER_STATS
    int             start_pid;
    void            *start_site;
    char            start_comm[16];
#endif
};

3.使用流程

a.定义定时器结构体变量

static struct hrtimer task1_timer;

b.初始化定时器任务

hrtimer_init(&task1_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
task1_timer.function = task1_timer_func;

c.实现定时器回调

static enum hrtimer_restart task1_timer_func(struct hrtimer *timer) 
{
    queue_work(test1_workqueue, &test1_item);   
    hrtimer_start(&task1_timer, ktime_set(2, 0), HRTIMER_MODE_REL);  // 2s
    return HRTIMER_NORESTART;
}

d.开启定时器

hrtimer_cancel(&task1_timer);
/* ktime_set第一个参数为秒单位,第二个参数为纳秒,定时时间0s + 900000000ns */
hrtimer_start(&task1_timer, ktime_set(0, 900000000), HRTIMER_MODE_REL);

4.注意事项
(1) 在需要调用开启函数hrtimer_start,先调用hrtimer_cancel将定时器关闭。避免定时器被被开启两次,导致bug。
(2) 重复调用定时器可以在定时器回调函数,返回值返回HRTIMER_RESTART。
也可以重新调用hrtimer_start,返回HRTIMER_NORESTART。
(3) 只需要重复执行指定次数,实现方法(举其中一种):

int i = 0, num = 4; 
static enum hrtimer_restart task1_timer_func(struct hrtimer *timer) 
{
    if(i < num) {
        i++;
        queue_work(test1_workqueue, &test1_item);
        hrtimer_start(&task1_timer, ktime_set(0, 900000000), HRTIMER_MODE_REL);  // 0.9s
    } else {
        i = 0;
    }

    return HRTIMER_NORESTART;
}

记录历经的路,分享个人总结与感悟。关注“开源519”,聊天窗口发送 “hrtimer代码” 获取笔者本篇代码实例,更多驱动学习资料尽在“开源519”公众号。

开源519.jpg

相关文章

  • L13. hrtimer使用实例(高精度定时器)

    1.简介随着内核不断更新演进,内核对定时器的分辨率要求越来越高。硬件的高速发展也逐渐能够满足内核的这一要求,因此内...

  • Linux 设备驱动之内核定时器 2020-02-20

    该内核定时器的实现是基于低精度定时器实现,高精度定时器的实现代码更为复杂,将在其他章节做相应介绍struct ti...

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • Golang Float高精度计算,无误差

    Golang Float乘Float高精度,转Int高精度。 使用big.Float bigF1 := new(b...

  • spark streaming源码分析之JobScheduler

    jobGenerator做了哪些事情呢? 持有一个定时器实例 这个定时器会依据batchDuration提交Gen...

  • VUE中定时器如何使用?

    定时器的创建和使用 定时器的销毁 定时器 setTimeout()方法 和 setInterval() 使用方法相...

  • C#高精度定时器

    因在项目中需要使用定时器播放帧动画,系统自带的定时器每秒最多执行60帧,因为误差较大,如果用于计时的任务,则会随着...

  • 2018-07-13

    Date 日期对象的API 时间定时器 现在时间实例 开始、停止倒计时实例 HTML代码 js代码

  • AlarmManager 设置和取消定时器 实例

    使用 AlarmManager 设置定时器的方法如下: 使用 AlarmManager 取消定时器的方法如下: 下...

  • vue 优化方法

    第三方插件按需引入,路由懒加载 v-for v-if 避免一起使用 组件实例销毁时,取消事件监听。清除定时器。 使...

网友评论

    本文标题:L13. hrtimer使用实例(高精度定时器)

    本文链接:https://www.haomeiwen.com/subject/zjkfrktx.html