代码学习inux内核驱动(二)

    技术2026-03-29  12

    代码学习inux内核驱动(二)

    睡眠延时等待函数

    #include <linux/device.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/string.h> #include <linux/list.h> #include <linux/types.h> #include <linux/delay.h> #include <linux/timer.h> #include <linux/slab.h> /****************************************************** HZ: 1s中中断次数 jiffies :记录系统启动后中断次数,内核利用该中断进行进程调度或延时等处理 jiffies_64 time_before time_after time_before_eq time_after_eq 小于jiffies的延时,使用以下,其为忙等待睡眠 udelay ndelay mdelay 非忙等待 schedul_timeout(timeout) msleep wait_event_timeout 定时器: struct timer_list my_timer init_timer() add_timer(); 实时时钟: do_gettimeofday ******************************************************/ MODULE_AUTHOR("xyzeng"); MODULE_LICENSE("Dual BSD/GPL"); void timer_func(struct timer_list * timelist) { printk("wait timer fun wait out ...\n"); //msleep(5); // 定时函数为软中断上下文,不能使用引起进程调度的函数 包括msleep wait_event_timeout ioremap vmalloc char * p = kmalloc(32,GFP_ATOMIC); //GFP_ATOMIC ,用于中断上下文,GFP_KERNEL,用于进程上下文 if(p == NULL) printk("kmalloc error!.\n"); printk("wait timer fun wait out 5s...\n"); } DEFINE_TIMER(my_timer,timer_func); //my_timer 不能在code_case_sleep_init定义为局部变量 static int code_case_sleep_init(void) { printk("[%s,%d] enter!\n",__FUNCTION__,__LINE__); printk("wait 3s ...\n"); msleep(1000*3); printk("wait 3s out\n"); printk("wait 4s ...\n"); unsigned long timeout = jiffies + HZ*5; while(time_before(jiffies,timeout)) continue; //忙等待 printk("wait 4s out\n"); printk("wait 5s ...\n"); schedule_timeout(5*HZ); //睡眠等待 printk("wait 5s out\n"); printk("wait short wait 1s ...\n"); mdelay(1000); printk("wait short wait 1s out\n"); printk("wait timer fun wait 5s ...\n"); // struct timer_list my_timer; // my_timer.function = timer_func; my_timer.expires = jiffies + 5 *HZ; add_timer(&my_timer); return 0; } static void code_case_sleep_exit(void) { printk("[%s,%d] enter!\n",__FUNCTION__,__LINE__); } module_init(code_case_sleep_init); module_exit(code_case_sleep_exit);
    Processed: 0.009, SQL: 9