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");

 

 

 

posted @ 2017-04-06 11:27  bkycrmn  阅读(486)  评论(0)    收藏  举报