linux 设备驱动程序 时间流 之 延迟执行 -2

原创 2004年09月27日 22:17:00

关于短延迟:
延迟通过使用jiffies达不到目的,只能使用内核函数:

udelay(unsigned long usecs);
mdelay(unsigned long msecs);

前者用软件循环指定的微妙数,后者调用前者达到延迟毫秒级。udelay函数只能用于获取较短的时间延迟,因为loops_per_second值的精度只有8位,所以,当计算更长的延迟时会积累出相当大的误差。尽管最大能允许的延迟将近1秒(因为更长的延迟就要溢出),推荐的 udelay 函数的参数的最大值是取1000微秒(1毫秒)。延迟大于 11 毫秒时可以使用函数 mdelay。
要特别注意的是 udelay 是个忙等待函数(所以 mdelay 也是),在延迟的时间段内无法运行其他的任务,因此要十分小心,尤其是 mdelay,除非别无他法,要尽量避免使用。
mdelay 在 Linux 2.0 中并不存在,头文件 sysdep.h 弥补了这一缺陷。

任务对列:
未完待续。。。

内核定时器:
内核中维护一个双向的timer_list结构的链表,内核每1秒钟遍历100(与具体的时钟中断的频率有关系?)次该链表,每次都要检查该链表上的timer_list结构的超时值,若超时,则调用相应的注册函数(马上调用吗?),然后从链表中移除这个entry。

注:根据《The Design of Unix Operating System》中关于时钟中断的代码那一段可以看到,在每个时钟中断里,都要检查那个双向的timer_list结构的链表,呵呵。

因此,定时器是另一个竞态资源,即使是在单处理器系统中。定时器函数访问的任何数据结构都要进行保护以防止并发访问,保护方法可以用原子类型(第10章讲述)或者用自旋锁。

删除定时器时也要小心避免竞态。考虑这样一种情况:某一模块的定时器函数正在一个处理器上运行,这时在另一个处理器上发生了相关事件(文件被关闭或模块被删除)。结果是,定时器函数等待一种已不再出现的状态,从而导致系统崩溃。为避免这种竞态,模块中应该用 del_timer_sync 代替 del_timer。如果定时器函数还能够重新启动自己的定时器(这是一种普遍使用的模式),则应该增加一个“停止定时器”标志,并在调用del_timer_sync之前设置。这样定时器函数执行时就可以检查该标志,如果已经设置,就不会用 add_timer 重新调度自己了。

还有一种会引起竞态的情况是修改定时器:先用 del_timer 删除定时器,再用 add_timer 加入一个新的以达到修改目的。其实在这种情况下简单地使用 mod_timer 是更好的方法。



对time_list结构的操纵以及定时器队列的操纵有:
init_timer(...); add_timer(...), del_timer(...), del_timer_sync(...)等等,具体请看转载2

linux 设备驱动程序 时间流 之 延迟执行 -1

一:自己通过循环实现:   a) j = jiffies + jit_delay * HZ;          while( jiffes                 /* nothing */;...
  • collide
  • collide
  • 2004年09月27日 20:52
  • 1258

linux 设备驱动程序 时间流 之 延迟执行 --转载

3  延迟执行 设备驱动程序经常需要将某些特定代码延迟一段时间后执行――通常是为了让硬件能完成某些任务。这一节将介绍许多实现延迟的不同技术,哪种技术最好取决于实际环境中的具体情况。我们将介绍所有的这些...
  • collide
  • collide
  • 2004年09月27日 20:46
  • 3545

linux 设备驱动程序 时间流 总结

第 6 章  时间流至此,我们基本知道怎样编写一个功能完整的字符模块了。现实中的设备驱动程序,除了实现必需的操作外还要做更多工作,如计时、内存管理,硬件访问等等。幸好,内核中提供的许多机制可以简化驱动...
  • collide
  • collide
  • 2004年09月27日 20:16
  • 2590

LINUX设备驱动程序(第3版)[高清PDF]

下载地址:网盘下载 内容简介 编辑 《LINUX设备驱动程序(第3版)》已针对Linux内核的2610版本彻底更新过了。内核的这个版本针对常见任务完成了合理化设计及相应的...
  • cf406061841
  • cf406061841
  • 2017年05月29日 10:07
  • 2078

如何编写Linux设备驱动程序以及测试详细流程(附实例)

Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简...
  • melody157398
  • melody157398
  • 2012年05月22日 13:49
  • 1018

时间、延迟(Linux设备驱动程序)

时间延迟 如何度量时间差,比较时间 如何获得当前时间 如何将操作延迟指定的一段时间 如何调度异步函数到指定的时间之后执行 度量时间差 内核通过定时器中断来跟踪时间流。 时钟中断由...
  • s651665496
  • s651665496
  • 2016年04月25日 20:43
  • 1086

linux设备驱动程序第二版 时间流

第6章 时间流至此,我们知道怎样写一个特性比较完全的字符模块了。我们将在后面几章陆续讨论驱动程序可以访问的一些内核资源。本章,我们先来看看内核代码是如何对时间问题进行处理的。该问题包括(按复杂程度排列...
  • menuconfig
  • menuconfig
  • 2007年08月24日 14:55
  • 1269

Linux设备驱动程序(第三版)/深入理解计算机系统(原书第2版)/[Android系统原理及开发要点详解].(韩超,梁泉)百度云盘下载

文档下载云盘连接:http://pan.baidu.com/s/1dDD2sgT 更多其他资料,请关注淘宝:http://shop115376623.taobao.com/ http://...
  • aidem_brown
  • aidem_brown
  • 2014年12月20日 22:24
  • 2728

手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)

这个专题我们来说下Linux中的定时器。在Linux内核中,有这样的一个定时器,叫做内核定时器,内核定时器用于控制某个函数,也就是定时器将要处理的函数在未来的某个特定的时间内执行。内核定时器注册的处理...
  • morixinguan
  • morixinguan
  • 2017年04月02日 17:56
  • 3855

手把手教你写Linux设备驱动---input子系统(二)--按键驱动实现(一)(基于友善之臂4412开发板)

在上一节里,我们用一个应用程序实现了鼠标的控制,并控制鼠标用相对位移不断的画一个正方形,感觉非常有意思,这一节,我们将通过一个简单按键实例来真正的实现一个input设备驱动程序。http://blog...
  • morixinguan
  • morixinguan
  • 2017年04月11日 00:11
  • 1599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 设备驱动程序 时间流 之 延迟执行 -2
举报原因:
原因补充:

(最多只允许输入30个字)