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; }