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_STATSint             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);  // 2sreturn 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


http://www.taodudu.cc/news/show-2614480.html

相关文章:

  • Machine Learning-L13-频繁模式挖掘
  • c语言程序设计对称字符串,清华大学C语言程序设计 L13_字符串精选.pdf
  • L13:MySQL - 性能与SQL优化2
  • l13Nginx创建负载均衡
  • L13 ansible 基础应用与常见模块
  • keil中 如何解决warning L13:Recursive call to Function 及overlay解释
  • ThinkPad L13笔记本怎么U盘重装系统教学
  • L13 DNS
  • 华大单片机开发板HC32L13X上手入门
  • 终于解决 归递调用 警告,其实程序没有 归递调用*** WARNING L13: RECURSIVE CALL TO SEGMENT
  • 庄懂着色器_L13_特效篇
  • 进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L13L14L15
  • 华大单片机-HC32L13X系列芯片OPA配置-芯虎论坛
  • L13过拟合欠拟合及其解决方案
  • 华大HC32L13x 串口波特率设置为115200打印乱码问题
  • 基于HC32L13X系列的YModem升级方案
  • 【国产单片机】华大HC32L13系列使用printf进行调试(多种方法)
  • L13:数据结构-5(树和二叉树)
  • L13 操作系统的这棵树
  • 国家品牌的崛起之路
  • CTF Blind pwn题型学习笔记
  • 第三方支付的流程分析与总结
  • 网银支付 加密解密说明
  • PHP支付宝支付开发流程
  • 银联支付(网银h5)
  • Java实现Native微信支付 超完整流程
  • 如何进行支付流程及安全测试?
  • 哥伦比亚网银支付PSE
  • android app银联支付,android app 快速接入银联支付流程(android studio版)
  • 新手支付对接流程重点

L13. hrtimer使用实例(高精度定时器)相关推荐

  1. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

  2. Linux 内核定时器使用 二 高精度定时器 hrtimer 的用例

    之前介绍了timer_list内核定时器,它的精度在毫秒级别,再高一点它就无能为力了,所幸内核提供了高精度定时器 hrtimer. 源文件在linux/kernel/hrtimer.c中.接口简单.下 ...

  3. linux 定时器 jiffies,linux下jiffies定时器和hrtimer高精度定时器(示例代码)

    一.jiffies定时器,HZ=100,精度只能达到10ms. 注:采用jiffies+msecs_to_jiffies(xx ms);可做到ms级,不过精度不够 #include //DO--> ...

  4. linux ps le hrtime,Linux 高精度定时器hrtimers简单介绍和应用场景

    hrtimer:high-resolution kernel timers: hrtimers的诞生是由于内核开发者在使用过程中发现,原始的定时器kernel/timers.c,已经可以满足所有场景的 ...

  5. hpet 定时器中断 8259 linux,[OSDEV]编程高精度定时器(HPET)

    高精度定时器HPET和I/O APIC一样,用的是内存映射,映射的地址保存在BIOS提供的ACPI表格中 我们首先来获取这个地址 获取HPET的I/O内存地址 先来看一下文档的30-31页: 关键就是 ...

  6. PLC高精度定时器(T法测速功能块)

    S7-200 SMART PLC时间间隔指令BGN_ITIME,和CAL_ITIME采用的是系统自带的1ms高精度定时器,PLC里只能调用一次.T法测速和M法测速应用时,都需要高精度时序定时器的支持( ...

  7. python高精度定时器中断_0015 高精度定时器

    0012提过高精度时钟中断,这篇来讲下定时器. 传统操作系统内核一般都有个时间片tick,即相隔一定时间发生一次时钟中断,比如1毫秒,10毫秒,dos时代的1/18.5秒,有高精度时钟之后,我们通过定 ...

  8. C++11实现高精度定时器、计时器

    C++11实现高精度定时器.计时器 直接上代码 #pragma once #ifndef _TIMER_H_ #define _TIMER_H_#include <functional> ...

  9. 多媒体高精度定时器介绍

    一:背景 在Windows系统下播放多媒体时,需要去精确控制播放过程,如果用Windows产生的WM_TIMER常规定时器来实现,多媒体画面会出现断断续续的现象,原因在于WM_TIMER只能提供大于等 ...

  10. 高精度定时器学习(通过官方手册学习)

    高精度定时器学习 功能描述 一般说明 HRTIM引脚和内部信号 时钟 Timer A..E timing units 翻转事件 功能描述 一般说明 HRTIM可以划分为几个模块: •主定时器 •计时单 ...

最新文章

  1. 使用tmpfs缓存文件提高性能
  2. linux中在vi编辑器中执行存盘退出命令是?
  3. JavaScript学习总结(五)——Javascript中==和===的区别
  4. 【复制指定目录下的指定类型文件,并修改后缀名】
  5. 为什么不用量子计算机挖比特币,Pieter Wuille:如果你有一台足够强的量子计算机,你能偷取多少比特币?...
  6. 代码review工具:Review Board
  7. mysql操作语句(简单笔记)
  8. NodeJS-001-Nodejs学习文档整理(转-出自http://www.cnblogs.com/xucheng)
  9. bzoj4806 炮
  10. 很有趣的STL初学资料
  11. 实例化vue发生了什么?(详解vue生命周期)
  12. maximum call stack size exceeded ajax,Maximum call stack size exceeded error
  13. java项目关联关系_Mybatis一对多关联关系映射实现过程解析
  14. 掩膜裁剪tif步骤_(8)空间数据投影变换、数据裁剪、拼接及提取
  15. 游戏制作(详细教程)
  16. CentOS 7下安装svn版本访问工具rabbitvcs
  17. EasyTouch插件是否还在使用?
  18. 关闭Window 10 Ctrl+Shift+B(表情包)快捷键冲突
  19. 积极主动 个人愿景的原则_IT专家的愿景:您个人需要了解的内容
  20. python学习测试题1及参考答案

热门文章

  1. 伪随机数产生原理及用法
  2. 对称加密算法 Blowfish 和 Twofish
  3. 这个疯子整理的十万字Java面试题汇总,终于拿下40W offer!(JDK源码+微服务合集+并发编程+性能优化合集+
  4. 芯动力——硬件加速设计方法——学习笔记(1)
  5. 为什么网络利用率增大,网络时延会受到消极影响?
  6. 微信公众号获取AppID和AppSecret
  7. Offset is outside the bounds of the DataView
  8. 小纸条:阿里云资源分享站
  9. 2022全国高中数学联赛A1卷T2几何答案
  10. ECCV 2018 paper