1、系统节拍率
内核的宏定义CONFIG_HZ表示系统节拍率,系统节拍率意味着每秒的节拍数,通常为100HZ。因为高节拍率虽然能够以更高的精度运行,时间测量也更加准确,但导致中断的产生更加频繁,频繁的中断会加剧系统的负担,所以为了追求平衡,通常设置为100HZ。
2、全局变量 jiffies
记录系统从启动以来的系统节拍数。
HZ 表示每秒的节拍数, jiffies 表示系统运行的 jiffies 节拍数,所以 jiffies/HZ 就是系统运行时间,单位为秒。
3、jiffies和时间ms、us、ns的转换
int jiffies_to_msecs(const unsigned long j) //j 参数为jiffies类型,返回值为对应的ms long msecs_to_jiffies(const unsigned int m) //m参数为ms,返回值为jiffies
4、定时器中断的例子
下面是一个定时器中断的例子,比较简单,0.5s产生一个定时器中断,在中断里将全局变量num加1,并打印num的值。
#include "linux/module.h"
#include "linux/timer.h"
#include "linux/jiffies.h"
//定义一个定时器结构体timer_list
struct timer_list demo_timer;
int num=0;
static void time_func(unsigned long data)
{
printk("num=%dn",num);
num++;
mod_timer(&demo_timer,jiffies + msecs_to_jiffies(500)); //必须在中断里通过mod_timer重新指定超时时间,否则这个中断只会进来一次
}
static int __init mytimer_init(void)
{
printk("mytimer_init!n");
init_timer(&demo_timer); //初始化定时器
demo_timer.function = time_func; //指定定时器中断函数,定时器超时后会执行time_func
demo_timer.expires = jiffies + msecs_to_jiffies(500); //定义超时时间,这里定义的是0.5s超时时间
//demo_timer.expires = jiffies + (0.5 * HZ); (或者写成这种方式,HZ是每秒节拍数)
add_timer(&demo_timer); //添加定时器开始计时
return 0;
}
static void __exit mytimer_exit(void)
{
printk("mytimer_exit!n");
del_timer(&demo_timer);
}
module_init(mytimer_init);
module_exit(mytimer_exit);
MODULE_LICENSE("Dual BSD/GPL");



