长延迟

有些驱动程序需要延迟比较长的时间,即长于一个时钟滴答;

忙等待

如果想把执行延迟若干个时钟滴答,或者对延迟的精度要求不高,最简单的实现方法就是一个监视jiffies计数器的循环;这种忙等待的实现方法通常具有下面形式,其中j1是延迟终止的jiffies值:

 while (time_before(jiffies, j1))
cpu_relax();

对cpu_relax的调用将以架构相关的方式执行,其中不执行大量的处理器代码;在许多系统上,该函数根本不会做任何事情;而在SMP系统上,它可能将处理器让给其他线程;但是,只要可能,我们应该避免使用这种方式,这里提到它,只是因为可能偶尔需要运行这段代码,以便更好的理解其他延迟计数;

让出处理器

忙等待为系统整体增加了沉重的负担,因此有必要寻找更好的延迟计数,比如在不需要CPU时主动释放CPU,这可以通过调用shcedule函数实现;

 while (time_before(jiffies, j1)) {
schedule();
}

当进程使用schedule释放处理器之后,没有任何保证说进程可以再随后很快就能得到处理器;除了影响计算机系统整体性能之外,这种用法对驱动程序的需求并不安全,因为延迟可能远大于需求;

超时

通过监视jiffies计数器实现的延迟循环可以工作,但不是非常理想;存在两种构造基于jiffies超时的途径,使用哪个规则则依赖于驱动程序是否在等待其他事件;

如果驱动程序使用等待队列类等待其他一些事件,而我们同时希望在特定的时间段内运行,则可以使用wait_event_timeout或者wait_event_interruptible_timeout函数:

 #define wait_event_timeout(wq, condition, timeout)
#define wait_event_interruptible_timeout(wq, condition, timeout)

上述函数会在给定的等待队列上休眠,但是会在超时到期时返回;这样,这两个函数实现了一种有界的休眠,这种休眠不会永远继续;注意,这里的timeout标识要等待的jiffies值,而不是绝对时间值;如果超时到期,这个两个函数会返回零;如果进程由其他事件唤醒,则会返回剩余的延迟时间,并用jiffies表达;返回值不会是负数,及时因为系统负荷而导致真正的延迟时间超过预期;

上述两个函数需要有人在等待队列上调用wake_up函数,或者超时到期;而在没有人会在等待队列上调用wake_up的情况下,进程将始终会在超时到期时被唤醒;为了适应这种不等待任何事件而延迟的情况,内核提供了schedule_timeout函数;

 signed long __sched schedule_timeout(signed long timeout)

这里,timeout是用jiffies表示的延迟时间,正常返回值是0,除非在给定超时值之前函数返回(比如响应某个信号);schedule_timeout要求调用者首先设置当前进程的状态,典型的调用如下:

 set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(delay);

需要注意的是超时到期和真正呗调度执行之间,需要额外的时间;

短延迟

当设备驱动程序需要处理硬件的延迟时,这种延迟通常最多涉及到几十个毫秒;这种情况下,依赖于时钟滴答显然不是正确的方法;

ndelay,udelay和mdelay这几个内核函数很好的完成短延迟任务,它们分别延迟指定数量的纳秒、微秒和毫秒时间,它们的原型如下:

 #define mdelay(n)
#define udelay(n)
#define ndelay(n)

需要注意的是,这三个延迟函数均是忙等待函数,因而在延迟过程中无法运行其他任务;因为,我们只能在没有其他实用方法时使用这些函数;

实现毫秒级(或者更长)延迟还有另一种方法,这种方法不涉及忙等待;

 void msleep(unsigned int msecs)
unsigned long msleep_interruptible(unsigned int msecs)
void ssleep(unsigned int seconds)

通常,如果我们能够容忍比所请求更长的延迟,则应当使用schedule_timeout、sleep或者ssleep;

Linux设备驱动程序 之 延迟执行的更多相关文章

  1. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  2. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  3. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  4. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  5. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  6. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  7. Linux设备驱动程序学习----3.模块的编译和装载

    模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...

  8. linux设备驱动程序-设备树(1)-dtb转换成device_node

    linux设备驱动程序-设备树(1)-dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂 ...

  9. linux设备驱动程序--在用户空间注册文件接口

    linux字符设备驱动程序--创建设备节点 基于4.14内核,运行在beagleBone green 在上一讲中,我们写了第一个linux设备驱动程序--hello_world,在驱动程序中,我们什么 ...

随机推荐

  1. ES6对数组的增强

    来看数组的改变,Array.from()可以将类数组对象变为数组: Array.of方法用于将一组值,转化为数组: 寻找数组中是否拥有某项find().findIndex(),里面要放置回调函数: 要 ...

  2. css 布局方式

    布局方式 1 布局:设置元素在网页中的排列方式及显示效果 2 分类: 1 标准流布局(文档流,普通流,静态流) 是默认的布局方式 特点:将元素按照书写顺序及元素类型,从上至下,从左至右排列 2 浮动布 ...

  3. 一个基于Scrapy框架的pixiv爬虫

    源码 https://github.com/vicety/Pixiv-Crawler,功能什么的都在这里介绍了 说几个重要的部分吧 登录部分 困扰我最久的部分,网上找的其他pixiv爬虫的登录方式大多 ...

  4. Windows工作原理

    Windows工作原理中心思想 Windows工作原理的中心思想就是“动态链接”概念.Windows自身带有一大套函数,应用程序就是通过调用这些函数来实现它的用户界面和在屏幕上显示文本与图形的.这些函 ...

  5. Linux命令——vi、cut、tr、wc、sort、uniq

    vi 和 vim ^跳转当前行第一个非空字符 Ctrl + b向下翻页 Ctrl + f向上翻页 Shift + % 找到()[] {},以及在括号之间来回切换 全局替换 一次性替换文件中的所有出现的 ...

  6. Linux下zookeeper集群搭建

    Linux下zookeeper集群搭建 部署前准备 下载zookeeper的安装包 http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper ...

  7. chkconfig 系统服务管理

    chkconfig --list   显示当前运行的所有服务/etc/inittabnetstat -antl   all n端口 t tcp协议 l listen状态chkconfig --add ...

  8. 一个页面,WEB全功能

    当鼠标在页面上往下滑动的时候,页面也一直向下,标签也顺带着全部向下滑动 以前浏览页面,主要是在PC上进行浏览,一个页面不适于太长,需要用户向下拖动: 当时的设计是,点击标签,点击不同的标签,跳转到不同 ...

  9. sklearn线性回归实现房价预测模型

    目录 题目要求 单特征线性回归 方案一 方案二 多特征线性回归 两份数据 ex1data1.txt ex1data2.txt 题目要求 建立房价预测模型:利用ex1data1.txt(单特征)和ex1 ...

  10. The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online - H Traveling on the Axis-【思维模拟题目】

    H Traveling on the Axis 作者: 浙江大学竞赛命题组 单位: ACMICPC 时间限制: 500 ms 内存限制: 64 MB 代码长度限制: 32 KB 传送门 BaoBao ...