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");
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)