目录
1.内核中时间概念:
1.系统节拍率:
系统节拍率100HZ 时间精度10ms,表示两个中断的间隔时间是10ms。
内核会根据HZ(系统定时器频率,节拍率)参数值,设置时钟事件设备,启动tick(节拍)中断。
HZ表示1秒中产生多少个时钟硬件中断,tick就表示连续两个中断的间隔时间。
HZ=100, 一个tick = 1/HZ, 所以默认一个tick为10ms。
更高的节拍率,意味着以更高的时间精度运行,时间测量也更加准确,但是高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担。(鱼和熊掌的关系,按照项目应用场景进行决定)
硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate),比如 1000Hz,100Hz 等等说的就是系统节拍率。
系统节拍率是可以设置的,单位是 Hz,我们在编译 Linux 内核的时候可以通过图形化界面设置系统节拍率,按照如下路径打开配置界面:
-> Kernel Features
-> Timer frequency (<choice> [=y])
选中“Timer frequency”,打开以后如下图所示:
从上图可以看出,可选的系统节拍率为 100Hz、200Hz、250Hz、300Hz、500Hz 和1000Hz,默认情况下选择 100Hz。设置好以后打开 Linux 内核源码根目录下的.config 文件,在此文件中有如下图所示定义:
CONFIG_HZ 为 100,Linux 内核会使用 CONFIG_HZ 来设置自己的系统时钟。打开文件 include/asm-generic/param.h,有如下内容:
1 #ifndef __ASM_GENERIC_PARAM_H
2 #define __ASM_GENERIC_PARAM_H
3
4 #include <uapi/asm-generic/param.h>
5
6 # undef HZ
7 # define HZ CONFIG_HZ /* Internal kernel timer frequency */
8 # define USER_HZ 100 /* some user interfaces are */
9 # define CLOCKS_PER_SEC (USER_HZ) /* in "ticks" like times() */
10 #endif /* __ASM_GENERIC_PARAM_H */
定义了一个宏 HZ,宏 HZ 就是 CONFIG_HZ,因此 HZ=100,我们后面编写 Linux驱动的时候会常常用到 HZ,因为 HZ 表示一秒的节拍数,也就是频率。
高节拍率和低节拍率的优缺点:
①、高节拍率会提高系统时间精度,如果采用 100Hz 的节拍率,时间精度就是 10ms,采用1000Hz 的话时间精度就是 1ms,精度提高了 10 倍。高精度时钟的好处有很多,对于那些对时间要求严格的函数来说,能够以更高的精度运行,时间测量也更加准确。
②、高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担,1000Hz 和 100Hz的系统节拍率相比,系统要花费 10 倍的“精力”去处理中断。中断服务函数占用处理器的时间增加,但是现在的处理器性能都很强大,所以采用 1000Hz 的系统节拍率并不会增加太大的负载压力。根据自己的实际情况,选择合适的系统节拍率。