目录

1、设置系统节拍率

1.1、CONFIG_HZ

2、jiffies

2.1、jiffies_64

2.2、系统运行时间

2.3、时间绕回

3、API函数

4、内核定时器

4.1、timer_list结构体

4.2、init_timer()函数

4.3、add_timer()函数

4.4、del_timer()函数

4.5、del_timer_sync()函数

4.6、mod_timer()函数

5、Linux 内核短延时函数


1、设置系统节拍率

在编译 Linux 内核的时候可以通过图形化界面设置系统节拍率。

-> Kernel Features-> Timer frequency

1.1、CONFIG_HZ

HZ 表示一秒的节拍数,Linux 内核会使用 CONFIG_HZ 来设置自己的系统时钟(include/asm-generic/param.h)

#undef HZ
#define HZ CONFIG_HZ
#define USER_HZ 100
#define CLOCKS_PER_SEC (USER_HZ)

2、jiffies

Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数(jiffies 定义在文件 include/linux/jiffies.h 中)。

#define __jiffy_data  __attribute__((section(".data")))extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;

2.1、jiffies_64

jiffies_64 用于 64 位系统,而 jiffies 用于 32 位系统。为了兼容不同的硬件, jiffies 其实就是 jiffies_64 的低 32 位。

2.2、系统运行时间

HZ 表示每秒的节拍数, jiffies 表示系统运行的 jiffies 节拍数,所以 jiffies/HZ 就是系统运行时间,单位为秒。

2.3、时间绕回

不管是 32 位还是 64 位的 jiffies,都有溢出的风险,溢出以后会重新从 0 开始计数。假如 HZ 为最大值 1000 的时候, 32 位的 jiffies 只需要 49.7 天就发生了绕回,对于 64 位的 jiffies 来说大概需要5.8 亿年才能绕回,因此 jiffies_64 的绕回忽略不计。

3、API函数

时间比较函数
time_after(unkown, known) 如果 unkown 超过 known 的话,返回真,否则返回假。
time_before(unkown, known) 如果 unkown 没有超过 known 的话,返回真,否则返回假。
time_after_eq(unkown, known) 如果 unkown 超过或等于 known 的话,返回真,否则返回假。
time_before_eq(unkown, known) 如果 unkown 没有超过或等于 known 的话,返回真,否则返回假。
jiffies 和 ms、 us、 ns 之间的转换函数
int jiffies_to_msecs(const unsigned long j) 将 jiffies 类型转换为对应的毫秒。
int jiffies_to_usecs(const unsigned long j) 将 jiffies 类型转换为对应的微秒。
u64 jiffies_to_nsecs(const unsigned long j) 将 jiffies 类型转换为对应的毫秒纳秒。
long msecs_to_jiffies(const unsigned int m) 将毫秒转换为 jiffies 类型。
long usecs_to_jiffies(const unsigned int u) 将微秒转换为 jiffies 类型。
unsigned long nsecs_to_jiffies(u64 n) 将纳秒转换为 jiffies 类型。

4、内核定时器

内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器(定义在include/linux/timer.h中)。

4.1、timer_list结构体

Linux 内核使用 timer_list 结构体表示内核定时器。

struct timer_list {struct list_head entry;unsigned long expires;struct tvec_base *base;void (*function)(unsigned long);unsigned long data;int slack;#ifdef CONFIG_TIMER_STATSint start_pid;void *start_site;char start_comm[16];
#endif
#ifdef CONFIG_LOCKDEPstruct lockdep_map lockdep_map;
#endif
}
entry 链表节点
expires 定时器超时时间,单位为节拍数
function 定时处理函数
data 要传递给 function 函数的参数

4.2、init_timer()函数

init_timer 函数负责初始化 timer_list 类型变量。

void init_timer(struct timer_list *timer)

参数 timer:要初始化定时器。

4.3、add_timer()函数

add_timer 函数用于向 Linux 内核注册定时器。

void add_timer(struct timer_list *timer)

参数 timer:要注册的定时器。

4.4、del_timer()函数

del_timer 函数用于删除一个定时器,不管定时器有没有被激活,都可以使用此函数删除。

int del_timer(struct timer_list * timer)

timer:要删除的定时器。
返回值: 0,定时器还没被激活; 1,定时器已经激活。
注:在多处理器系统上,定时器可能会在其他的处理器上运行,因此在调用 del_timer 函数删除定时器之前要先等待其他处理器的定时处理器函数退出。

4.5、del_timer_sync()函数

del_timer_sync 函数是 del_timer 函数的同步版,会等待其他处理器使用完定时器再删除,
del_timer_sync 不能使用在中断上下文中。

int del_timer_sync(struct timer_list *timer)

timer:要删除的定时器。
返回值: 0,定时器还没被激活; 1,定时器已经激活。

4.6、mod_timer()函数

mod_timer 函数用于修改定时值,如果定时器还没有激活的话, mod_timer 函数会激活定时器

int mod_timer(struct timer_list *timer, unsigned long expires)

timer:要修改超时时间(定时值)的定时器。
expires:修改后的超时时间。
返回值: 0,调用 mod_timer 函数前定时器未被激活; 1,调用 mod_timer 函数前定时器已
被激活。

5、Linux 内核短延时函数

void ndelay(unsigned long nsecs) 纳秒延时函数。
void udelay(unsigned long usecs) 微秒延时函数。
void mdelay(unsigned long mseces) 毫秒延时函数。

linux驱动-定时器相关推荐

  1. Linux驱动-使用软定时器实现PWM输出

    Linux驱动-使用软定时器实现PWM输出 ​ 在没有pwm外设的情况下,可以使用定时器+GPIO的方法来实现pwm输出,实现pwm频率和占空比可控的功能.本文实现了一个Linux内核驱动,使用两个软 ...

  2. linux驱动开发5 按键中断实验(定时器和中断)

    led:IO的输出 :key:IO的输入 法一:直接读写IO 使用while(1)无限读取,但CPU占用达到了99.6%,所以不行 #include <linux/types.h>#inc ...

  3. 迅为嵌入式linux驱动开发笔记(八)—内核定时器

    内核定时器 二. Linux 内核定时器基础知识 Linux 内 核 使 用 timer_list 结 构 体表示内核定时器 ,timer_list定义在文件 include/linux/timer. ...

  4. 嵌入式linux硬件成本,嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的?...

    原标题:嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的? 作为一个驱动开发者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地方的竞争是如此得强烈, ...

  5. Linux 内核定时器实验————复习到这

    目录 Linux 时间管理和内核定时器简介 内核时间管理简介 内核定时器简介 Linux 内核短延时函数 硬件原理图分析 实验程序编写 修改设备树文件 定时器驱动程序编写 编写测试APP 运行测试 编 ...

  6. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  7. linux上的定时器上的jiffies,Linux kernel -- 定时器/jiffies

    0. 测试环境 Linux 2.6.39 AT91SAM9G45 1. 定时器简单的测试例子 #include #include MODULE_LICENSE("GPL"); st ...

  8. linux内核驱动ldd3_手把手教Linux驱动7内核互斥锁

    互斥体概述 信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mutex用于互斥操作.信号量的count初始化为1,down()/up()也可以实现类似mutex的作用. mutex ...

  9. linux驱动编写(虚拟字符设备编写)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关 ...

最新文章

  1. exp oracle 表空间,oracle之EXP导出表空间错误解决
  2. 机器学习-tensorflow
  3. 我的世界服务器抽奖系统怎么弄,我的世界自动识别货币抽奖机如何制作
  4. 蓝桥杯基础模块9:IO口扩展与存储器映射
  5. JavaScript 中typeof、instanceof 与 constructor 的区别?
  6. 自己做量化交易软件(32)小白量化实战6--仿通达信公式选股
  7. 特洛伊木马程序开发技术
  8. 台式计算机硬件组装应按什么步骤顺序进行,计算机硬件组装正确步骤
  9. redis在php下面的命令大全
  10. Reapp 混合应用 - 帮助构建前所未所的强大应用(Reapp Hybrid apps - help you build powerful apps like never before)
  11. Canvas绘制大时钟
  12. 用matlab求解jacobi,用jacobi迭代法求解线性方程,求助matlab大师
  13. pg数据库数据量很小但是data目录很大的排查思路
  14. hadoop配置文件workers
  15. python绘制七巧板_CSS3制作七巧板动画
  16. 微信公众平台接口程序定制菜单
  17. ArrayMap 源码解析
  18. 软件的生命周期的若干阶段
  19. 计算机c盘删除的文件怎么找回,电脑C盘里面文件误删了,不能开启电脑了,怎么办?...
  20. C专家编程(Expert C Programming)(二)

热门文章

  1. php json转为XML
  2. H5解决浏览器,微信背景的上下滑动问题,脱离窗口的js局部滚动解决方法
  3. 自动驾驶汽车系统的重要性
  4. taro多端开发框架
  5. linux共享内存原IPCS,linux调试工具ipcs的深入分析
  6. gluLookAt函数
  7. a76比a73强多少_OPPOA73和vivoY75哪个好 OPPOA73和vivoY75对比
  8. Windows下使用Rtools编译R语言包
  9. 虹软人脸识别Java SDK
  10. 虹软人脸识别使用教程