环境:主机:Fedora 12目标板:MINI6410目标板LINUX内核版本:2.6.38
实现功能:延迟2S
方法1:利用系统全局变量jiffiesjiffies记录系统节拍,每一次节拍,内核时钟中断函数会将jiffies加1.HZ在ARM中为100,表示1S被分为100份,系统每个节拍为10ms.修改上篇《Linux驱动编写:LED驱动测试》(见 http://www.linuxidc.com/Linux/2012-01/51818.htm)中的ioctl函数,测试延时
[cpp] - <span style="font-family:"Arial Black";font-size:18px;">//功能: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;
- }</span>
这个方法会使内核忙等待,会影响系统效率.
2.利用宏ndelay(n),延时nsudelay(n),延时usmdelay(n),延时ms这个简单,不做介绍