9.1时间管理之Jiffies、HZ
HZ:内核通过底层硬件用于衡量时间的节拍频率 ==》 PC: 1000Hz (1ms) ARM: 200Hz (5ms)
jiffies:64位,一直做累加,jiffies变量记录了系统启动以来,系统定时器已经触发的次数。
//f = 1/T; 1000hz = 1/0.001s, 200hz = 1/0.005s
内核每秒钟将jiffies变量增加HZ次。一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。
jiffieshz0目录:
1 obj-m := demo.o 2 3 KERNEL := /lib/modules/$(shell uname -r)/build/ 4 5 all: 6 make -C $(KERNEL) M=`pwd` 7 clean: 8 make -C $(KERNEL) M=`pwd` clean 9
1 /* head file */ 2 #include <linux/init.h> 3 #include <linux/module.h> 4 5 void bootok_total_time(void) 6 { 7 u32 h, m, s; 8 s = jiffies/HZ; 9 10 h = s/3600; 11 m = s%3600/60; 12 s = s%60; 13 14 printk("bootok totoal time: %02dh-%02dm-%02ds\n", h, m, s); 15 } 16 17 /* driver module entry */ 18 static int __init demo_init(void) 19 { 20 printk("HZ = %d, jiffies = %lu\n", HZ, jiffies); 21 22 bootok_total_time(); 23 return 0; 24 } 25 26 module_init(demo_init); 27 28 29 /* driver module exit */ 30 static void __exit demo_exit(void) 31 { 32 printk("goodbye, world!\n"); 33 } 34 module_exit(demo_exit); 35 36 /* driver module description */ 37 MODULE_LICENSE("GPL"); 38 39 MODULE_AUTHOR("crmn"); 40 MODULE_VERSION("crmn1.0"); 41 MODULE_DESCRIPTION("example for driver module arch");
jiffieshz目录:
1 obj-m := demo.o 2 3 KERNEL := /lib/modules/$(shell uname -r)/build/ 4 #KERNEL := /linux-3.5/ 5 6 all: 7 make -C $(KERNEL) M=`pwd` 8 clean: 9 make -C $(KERNEL) M=`pwd` clean 10
1 /* head file */ 2 #include <linux/init.h> 3 #include <linux/module.h> 4 #include <linux/sched.h> 5 /* 6 * time_before/time_before_eq 7 * time_after/time_after_eq 8 * */ 9 void mydelay(u32 s)//delay:忙则等待,占用CPU资源,延时过程中不能运行其他任务 10 { 11 u32 end = jiffies + s*HZ; 12 13 while (time_before((unsigned long)jiffies, (unsigned long)end)) { 14 schedule(); //把CPU资源让出去 15 } 16 } 17 18 void mysleep(u32 s)//sleep:不会占用CPU资源,sleep函数使调用的进程进行休眠 19 { 20 set_current_state(TASK_INTERRUPTIBLE);// 21 schedule_timeout(s*HZ);//睡眠等待 22 } 23 24 #if 0 25 void mysleep(u32 s) 26 { 27 wait_queue_head_t wait; 28 init_waitqueue_head(&wait); 29 wait_event_interruptible_timeout(wait, 0, HZ*s); 30 } 31 #endif 32 33 void bootok_total_time(void)//获取开机到现在的时间 34 { 35 u32 h, m, s; 36 s = jiffies/HZ;//获取开机到现在的秒数 37 38 h = s/3600; 39 m = s%3600/60; 40 s = s%60; 41 42 printk("bootok totoal time: %02dh-%02dm-%02ds\n", h, m, s); 43 } 44 45 /* driver module entry */ 46 static int __init demo_init(void) 47 { 48 printk("HZ = %d, jiffies = %lu\n", HZ, jiffies);// 49 50 bootok_total_time(); 51 mysleep(1);//睡眠1s 52 bootok_total_time(); 53 54 return 0; 55 } 56 57 module_init(demo_init); 58 59 60 /* driver module exit */ 61 static void __exit demo_exit(void) 62 { 63 printk("goodbye, world!\n"); 64 } 65 module_exit(demo_exit); 66 67 /* driver module description */ 68 MODULE_LICENSE("GPL"); 69 70 MODULE_AUTHOR("crmn"); 71 MODULE_VERSION("crmn1.0"); 72 MODULE_DESCRIPTION("example for driver module arch");