您的位置:首页 > 运维架构 > Linux

Linux驱动:内核延时测试

2012-12-07 13:57 525 查看
本文博客链接: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函数,测试延时

[cpp] view
plaincopy

<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"\tjdh:led_driver cmd=%d arg=%d jiffies = %d\n",cmd,arg,jiffies);  

      

    return 0;  

}</span>  

这个方法会使内核忙等待,会影响系统效率.

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个相比差别在于会被中断唤醒。调用这两个函数,内核会阻塞当前进程,将其放入等待队列,等待时间到。

代码:

[cpp] view
plaincopy

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

    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;  

}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: