Linux驱动:内核延时测试
2019-07-12 18:14发布
生成海报
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" jdh:led_driver cmd=%d arg=%d jiffies = %d
",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" jdh:led_driver cmd=%d arg=%d jiffies = %d
",cmd,arg,jiffies);
return 0;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮