之前介绍了timer_list内核定时器,它的精度在毫秒级别,再高一点它就无能为力了,所幸内核提供了高精度定时器 hrtimer。

源文件在linux/kernel/hrtimer.c中。接口简单。下面介绍一下相关接口

1. 定时器定义与绑定超时回调函数
static struct hrtimer timer;/* 设置回调函数 */
timer.function = hrtimer_hander;2. 定时器初始化
/**  参数timer是hrtimer指针,*  参数clock_id有如下常用几种选项:*  CLOCK_REALTIME   //实时时间,如果系统时间变了,定时器也会变*  CLOCK_MONOTONIC  //递增时间,不受系统影响*  参数mode有如下几种选项:*   HRTIMER_MODE_ABS = 0x0,        /* 绝对模式 */HRTIMER_MODE_REL = 0x1,      /* 相对模式 */HRTIMER_MODE_PINNED = 0x02,  /* 和CPU绑定 */HRTIMER_MODE_ABS_PINNED = 0x02, /* 第一种和第三种的结合 */HRTIMER_MODE_REL_PINNED = 0x03, /* 第二种和第三种的结合 */*/
void hrtimer_init(struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode);3. 定时器启动
/** 参数timer是hrtimer指针* 参数tim是时间,可以使用ktime_set()函数设置时间,* 参数mode和初始化的mode参数一致*/
hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode);4. 设置时间
/** 单位为秒和纳秒组合*/
ktime_t ktime_set(const long secs, const unsigned long nsecs);/* 设置超时时间,当定时器超时后可以用该函数设置下一次超时时间 */
hrtimer_forward_now(struct hrtimer *timer, ktime_t interval)5. 注意事项:
定时器超时后会调用回调函数,回调函数结构类似这样:
enum hrtimer_restart        (*function)(struct hrtimer *);enum hrtimer_restart {HRTIMER_NORESTART,  /* 不重启定时器 */HRTIMER_RESTART,    /* 重启定时器 */
};
在回调函数返回前要手动设置下一次超时时间。
另外,回调函数执行时间不宜过长,因为是在中断上下文中,如果有什么任务的话,最好使用工作队列等机制。6. 关闭定时器
int hrtimer_cancel(struct hrtimer *timer);简单用例:
/**  Description : 高精度定时器用例*  Author : mason*  Date   : 201808*/#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/hrtimer.h>
#include <linux/jiffies.h>static struct hrtimer timer;
ktime_t kt;/* 定时器回调函数 */
static enum hrtimer_restart  hrtimer_hander(struct hrtimer *timer)
{printk("hrtimer up\r\n");/* 设置下次过期时间 */kt = ktime_set(3,0);    hrtimer_forward_now(timer, kt);/* 该参数将重新启动定时器 */    return HRTIMER_RESTART;
}static int __init hrtimer_demo_init(void)
{printk("hello hrtimer \r\n");kt = ktime_set(1,10);/* hrtimer初始化 */hrtimer_init(&timer,CLOCK_MONOTONIC,HRTIMER_MODE_REL);/* hrtimer启动 */hrtimer_start(&timer,kt,HRTIMER_MODE_REL);/* 设置回调函数 */timer.function = hrtimer_hander;return 0;
}static void __exit hrtimer_demo_exit(void)
{/* hrtimer注销 */hrtimer_cancel(&timer);printk("bye hrtimer\r\n");
}module_init(hrtimer_demo_init);
module_exit(hrtimer_demo_exit);
MODULE_LICENSE("GPL");

参考文档 :

1. Linux 下定时器的实现方式分析

https://www.ibm.com/developerworks/cn/linux/l-cn-timers/

2. hrtimer高精度定时器的简单使用【学习笔记】

https://www.cnblogs.com/zzb-Dream-90Time/p/7084916.html

Linux 内核定时器使用 二 高精度定时器 hrtimer 的用例相关推荐

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

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

  2. linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)

    linux内核开发入门二(内核KO模块介绍.开发流程以及注意事项) 一.什么是内核模块 内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核 ...

  3. 自旋锁 - linux内核锁(二)

    自旋锁用于处理器之间的互斥,适合保护很短的临界区,并且不允许在临界区睡眠.申请自旋锁的时候,如果自旋锁被其他处理器占有,本处理器自旋等待(也称为忙等待).进程.软中断和硬中断都可以使用自旋锁.自旋锁是 ...

  4. linux 驱动线程与进程,Linux内核学习之二-进程与线程

    一.操作系统的功能 根据维基百科的解释,一个操作系统大概包括以下几个功能: 进程管理(Processing management) 安全机制(Security) 内存管理(Memory managem ...

  5. Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量

    <semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...

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

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

  7. Linux内核分析 笔记二 操作系统是如何工作的 ——by王玥

    一.知识要点 1.计算机是如何工作的?(总结)--三个法宝 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算 ...

  8. Linux内核编程(二)-----------Linux内核初探

    写在前面:本篇主要介绍Linux内核的开发模式.linux代码的组成.vmlinux  zImage  uImage的区别,以及编译下内核. 正文: 一.Linux内核的开发模式 1.git:是一个分 ...

  9. Linux内核驱动初探(二) TI声卡

    目录 0. 前言 1. menuconfig 2. 超时问题 3. 稳定性问题 0. 前言 通过查询该设备原理图可知,该声卡的Codec芯片型号为德州仪器 TLV320DAC3101. 1. menu ...

最新文章

  1. 域名年龄-SEO搜索引擎优化
  2. 计算程序运行时间(.net1.1 于.net2.0的区别)在.net2.0中提供了Stopwatch类,简单例子...
  3. 中高德地图只显示某一城市_小O地图 - 城市交通态势数据查询及下载
  4. Nginx与Tomcat实现请求动态数据与请求静态资源的分离
  5. 我用过的,我正在用的,比较高效、好用的命令
  6. 云安全:云访问安全代理(CASB)系统的陷阱和潜力
  7. 腾讯GaiaStack容器平台负责人罗韩梅:All on GaiaStack
  8. html的带分页的表格写法,Html表格分页
  9. android组合控件 重叠,Android 组合控件实现布局的复用的方法
  10. daocloud创建mysql_DaoCloud体验-使用node构建应用程序
  11. 仿链家地图找房_仿链家地图找房的简单实现
  12. 信息学奥赛一本通|1183:病人排队
  13. 华师计算机前沿讲座课程论文,17春华师《教育技术前沿讲座》在线作业
  14. 前Google工程师Levandowski跳入优步监狱
  15. 入门级练习题(1-15)
  16. [Go实战]简单使用scylladb
  17. 基于Paddle复现《Neighbor2Neighbor: Self-Supervised Denoising from Single Noisy Images》降噪网络
  18. Wampserver 如何连接远程数据库,云数据库
  19. python数据内容_炼数成金:Python数据分析内容分享
  20. CSS——行高、字体、文本的样式

热门文章

  1. iOS开发-多线程开发之线程安全篇
  2. Unity NGUI 3.0.4版本 制作网络版斗地主
  3. Delphi中静态方法重载还是覆盖的讨论
  4. [projectEuler.net]12
  5. srwebsocket 服务器过段时间会关闭_王者荣耀:伽罗大招遭到暗改?开启后直接冷却时间,无法手动关闭...
  6. 大数据分析中国冬季重度雾霾的成因(二)
  7. php实现tail,Linux-如何用php实现Linux下的tail -f命令?
  8. 【数理知识】《随机过程》方兆本老师-目录
  9. 【Matlab 图像】灰度二值化处理
  10. 1.9 GRU 单元-深度学习第五课《序列模型》-Stanford吴恩达教授