Linux驱动:内核延时测试

Linux驱动:内核延时测试


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:Fedora12

目标板:MINI6410

目标板LINUX内核版本:2.6.38


实现功能:

延迟2S


方法1:利用系统全局变量jiffies

jiffies记录系统节拍,每一次节拍,内核时钟中断函数会将jiffies加1.

HZ在ARM中为100,表示1S被分为100份,系统每个节拍为10ms.

修改上篇《linux驱动编写:LED驱动测试》中的ioctl函数,测试延时

//功能:ioctl操作函数
//返回值:成功返回0
static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	unsigned int temp = 0;
	unsigned long t = 0;
	
	temp = readl(S3C64XX_GPKDAT);
	if (cmd == 0)
	{
		temp &= ~(1 << (arg + 3));
	}
	else
	{
		temp |= 1 << (arg + 3);
	}

	//等待2S
	t = jiffies;
	while (time_after(jiffies,t + 2 * HZ) != 1);
	writel(temp,S3C64XX_GPKDAT);

	printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d jiffies = %d\n",cmd,arg,jiffies);
	
	return 0;
}
这个方法会使内核忙等待,会影响系统效率.


2.利用宏ndelay(n),延时ns

udelay(n),延时us

mdelay(n),延时ms

这个简单,不做介绍


3.利用内核进行延时

long sleep_on_timeout(wait_queue_head 8q,long time_out);

long interruptible_sleep_on_timeout(wait_queue_head 8q,long time_out);

第2个与第1个相比差别在于会被中断唤醒。调用这两个函数,内核会阻塞当前进程,将其放入等待队列,等待时间到。

代码:

//功能:ioctl操作函数
//返回值:成功返回0
static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	unsigned int temp = 0;
	//unsigned long t = 0;
	wait_queue_head_t wait;
	
	temp = readl(S3C64XX_GPKDAT);
	if (cmd == 0)
	{
		temp &= ~(1 << (arg + 3));
	}
	else
	{
		temp |= 1 << (arg + 3);
	}

	//等待2S
	//t = jiffies;
	//while (time_after(jiffies,t + 2 * HZ) != 1);
	init_waitqueue_head(&wait);
	sleep_on_timeout(&wait,2 * HZ);
	writel(temp,S3C64XX_GPKDAT);

	printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d jiffies = %d\n",cmd,arg,jiffies);
	
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值