代码学习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);
转载请注明原文地址:https://ipadbbs.8miu.com/read-63812.html