`
ydbc
  • 浏览: 711579 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    linux内核驱动学习

    当一个设备驱动需要处理硬件的延迟(latency潜伏期), 涉及到的延时通常最多几个毫秒,在这个情况下, 不应依靠时钟嘀哒,而是内核函数

    linux设备驱动程序第三版

    1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

    不仅透彻讲解了基本概念和技术,更深入探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如pcmcia、i2c和usb等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的内核源码文件,给出...

    linux设备驱动程序-第三版(中文版)

    1. 第一章 设备驱动简介 2. 建立和运行模块 3. 字符驱动 4. 调试技术 5. 并发和竞争情况 6. 高级字符驱动操作 7. 时间, 延时, 和延后工作 8. 分配内存 9. 与硬件通讯

    精通LINUX设备驱动程序开发

    version 2.85 booting 19 2.2 内核模式和用户模式 20 2.3 进程上下文和中断上下文 20 2.4 内核定时器 21 2.4.1 hz和jiffies 21 2.4.2 长延时 22 2.4.3 短延时 24 2.4.4 pentium时间戳计数器 24 2.4.5 实时...

    linux项目工程资料-linux-pcie 驱动,能够测延时.zip

    该项目以Linux内核为核心,围绕其构建了一个完整的操作系统,包括各种系统工具、库、应用程序和硬件支持。 以下是Linux项目的一些主要特点和资料介绍: 开放源代码:Linux项目的所有源代码都是公开的,并允许任何...

    Android驱动开发权威指南

    第二篇 勿于浮砂筑高台——Linux驱动基础篇 第3章Linux内核综述 3.1 OS基本概念 3.1.1多用户系统 3.1.2用户和组 3.1.3进程 3.1.4 Linux单核架构 3.2 Linux内核综述 3.2.1进程/内核模型综述 3.2.2内存管理综述 3.2.3...

    Linux设备驱动程序第三版2.6

    第 1 章 第一章 设备驱动简介 第 2 章 建立和运行模块 第 3 章 字符驱动 第 4 章 调试技术 第 5 章 并发和竞争情况 第 6 章 高级字符驱动操作 第 7 章 时间, 延时, 和延后工作

    LINUX安装与配置简明手册

    10.2.2 确定内核是测试版还是正式版 115 10.2.3 通过发行商做好升级内核的 准备 115 10.2.4 哪里可以找到内核源代码 116 10.2.5 为新内核加上LILO选项 116 10.2.6 测试内核安装效果 116 10.2.7 使用Caldera发行版本...

    Linux中gpio接口的使用方法示例

    Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0~MAX_INT之间的整数标识,不能使用负数,gpio与硬件体系密切相关的,不过linux有一...

    linux安装与配置简明手册

    10.2.2 确定内核是测试版还是正式版 115 10.2.3 通过发行商做好升级内核的 准备 115 10.2.4 哪里可以找到内核源代码 116 10.2.5 为新内核加上LILO选项 116 10.2.6 测试内核安装效果 116 10.2.7 使用Caldera...

    pktgen-20.06.0.tar.gz

    pktgen是一个位于linux内核层的高性能网络测试工具,由瑞士皇家理工大学的TSlab实验室的Robert Olsson开发的(现在应该不在皇家理工了),主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址...

    pktgen-3.7.2.tar.gz

    pktgen是一个位于linux内核层的高性能网络测试工具,由瑞士皇家理工大学的TSlab实验室的Robert Olsson开发的(现在应该不在皇家理工了),主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址...

    pktgen-19.12.0.tar.gz

    pktgen是一个位于linux内核层的高性能网络测试工具,由瑞士皇家理工大学的TSlab实验室的Robert Olsson开发的(现在应该不在皇家理工了),主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址...

    uboott移植实验手册及技术文档

    4、交叉编译器 arm-softfloat-linux-gnu-gcc-3.4.5 【实验步骤】 一、建立自己的平台类型 (1)解压文件 #tar jxvf u-boot-1.3.1.tar.bz2 (2)进入 U-Boot源码目录 #cd u-boot-1.3.1 (3)创建自己的开发板...

    vc++ 开发实例源码包

    Linux内核完全注释附 如题,我没看。 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 如题。 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,...

    c语言编写单片机技巧

    UP测试,温度循环测试,高温贮存测试,湿度贮存测试等。 成测则是产品封装好后的测试,即PACKAGE测试。即是所有通过中测的产品封装后的测试,方法主要是机台自动测试,但测试项目仍与WAFER TEST相同。PACKAGE...

    Radmin_3.4_完美破解版

    其 DirectScreenTransfer™ 新技术使用视频挂钩内核模式驱动程序,将捕捉率提高到每秒数百次屏幕更新。通过其特别的低带宽优化功能,您甚至可以在使用拨号调制解调器和 GPRS 连接的情况下,顺心地进行工作。 通过...

    vc++ 应用源码包_1

    Linux内核完全注释附 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视...

Global site tag (gtag.js) - Google Analytics