9.2时间管理之shortdelay、currenttime
短延时mdelay、udelay、ndelay
睡眠延时msleep、ssleep
shortdelay目录:
1 obj-m := demo.o 2 3 #KERNEL := /lib/modules/$(shell uname -r)/build/ 4 KERNEL := /lib/modules/$(shell uname -r)/build/ 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 #include <linux/delay.h> 7 8 /* 9 * 非睡眠延时: 10 * ndelay/udelay/mdelay 11 * 12 * 睡眠延时: 13 * nsleep/ssleep msleep 14 * */ 15 16 /* 17 * time_before/time_before_eq 18 * time_after/time_after_eq 19 * */ 20 void mydelay(u32 s) 21 { 22 u32 end = jiffies + s*HZ; 23 24 while (time_before((unsigned long)jiffies, (unsigned long)end)) { 25 schedule(); 26 } 27 } 28 29 void mysleep(u32 s) 30 { 31 set_current_state(TASK_INTERRUPTIBLE); 32 schedule_timeout(s*HZ); 33 } 34 35 #if 0 36 void mysleep(u32 s) 37 { 38 wait_queue_head_t wait; 39 init_waitqueue_head(&wait); 40 wait_event_interruptible_timeout(wait, 0, HZ*s); 41 } 42 #endif 43 44 void bootok_total_time(void) 45 { 46 u32 h, m, s; 47 s = jiffies/HZ; 48 49 h = s/3600; 50 m = s%3600/60; 51 s = s%60; 52 53 printk("bootok totoal time: %02dh-%02dm-%02ds\n", h, m, s); 54 } 55 56 /* driver module entry */ 57 static int __init demo_init(void) 58 { 59 printk("HZ = %d, jiffies = %lu\n", HZ, jiffies); 60 61 bootok_total_time(); 62 mysleep(1);//睡眠等待 63 bootok_total_time(); 64 65 return 0; 66 } 67 68 module_init(demo_init); 69 70 71 /* driver module exit */ 72 static void __exit demo_exit(void) 73 { 74 printk("goodbye, world!\n"); 75 } 76 module_exit(demo_exit); 77 78 /* driver module description */ 79 MODULE_LICENSE("GPL"); 80 81 MODULE_AUTHOR("crmn"); 82 MODULE_VERSION("crmn1.0"); 83 MODULE_DESCRIPTION("example for driver module arch");

currenttime目录:
1 obj-m := demo.o 2 3 KERNEL := /linux-3.5/ 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 #include <linux/sched.h> 5 6 #include <linux/delay.h> 7 8 /*do_gettimeofday*/ 9 /* 10 * @do_gettimeofday(struct timeval *tv); 11 * 12 * struct timeval time; 13 * 14 * do_gettimeofday(&time); 15 * 16 * 17 * @struct timespec current_kernel_time(void) 18 * 19 * struct timespec time; 20 * 21 * time = current_kernel_time(); 22 * */ 23 24 /* 25 * 非睡眠延时: 26 * ndelay/udelay/mdelay 27 * 28 * 睡眠延时: 29 * nsleep/ssleep 30 * */ 31 32 /* 33 * time_before/time_before_eq 34 * time_after/time_after_eq 35 * */ 36 void mydelay(u32 s) 37 { 38 u32 end = jiffies + s*HZ; 39 40 while (time_before((unsigned long)jiffies, (unsigned long)end)) { 41 schedule(); 42 } 43 } 44 45 void mysleep(u32 s) 46 { 47 set_current_state(TASK_INTERRUPTIBLE); 48 schedule_timeout(s*HZ); 49 } 50 51 #if 0 52 void mysleep(u32 s) 53 { 54 wait_queue_head_t wait; 55 init_waitqueue_head(&wait); 56 wait_event_interruptible_timeout(wait, 0, HZ*s); 57 } 58 #endif 59 60 void bootok_total_time(void) 61 { 62 u32 h, m, s; 63 s = jiffies/HZ; 64 65 h = s/3600; 66 m = s%3600/60; 67 s = s%60; 68 69 printk("bootok totoal time: %02dh-%02dm-%02ds\n", h, m, s); 70 } 71 72 /* driver module entry */ 73 static int __init demo_init(void) 74 { 75 struct timespec tmspec0, tmspec1; 76 long tv; 77 78 tmspec0 = current_kernel_time(); 79 mdelay(10); 80 tmspec1 = current_kernel_time(); 81 82 tv = tmspec1.tv_nsec - tmspec0.tv_nsec; 83 84 printk("tv = %ld\n", tv); 85 86 return 0; 87 } 88 89 module_init(demo_init); 90 91 92 /* driver module exit */ 93 static void __exit demo_exit(void) 94 { 95 printk("goodbye, world!\n"); 96 } 97 module_exit(demo_exit); 98 99 /* driver module description */ 100 MODULE_LICENSE("GPL"); 101 102 MODULE_AUTHOR("crmn"); 103 MODULE_VERSION("crmn1.0"); 104 MODULE_DESCRIPTION("example for driver module arch");

浙公网安备 33010602011771号