原文:

翻译:@hduffddybz

校订:@lzufalcon

高精度定时器目录描述

高精度定时器项目的目标是在Linux中实现POSIX1003.1bSection14(时钟,定时器)的API。包括了对高精度定时器的支持-也就是说定时器的精度好于1个滴答。

当该项目启动时,Linux还不支持POSIX的时钟和定时器的API。随着时间推移,时钟和定时器的API被采纳,但是支持高精度时钟的核心基础设施被主线(2.6.21内核)接受。在编撰本文时,并不是所有的嵌入式平台都支持高精度定时器,甚至虽然内核中有支持的代码,配置上去也比较复杂。

基本原理

当时,Linux中的定时器仅仅支持1个滴答精度,滴答的时间宽度依赖于内核中的HZ值,在i386和其他一些平台中是1ms,而在绝大多数的嵌入式平台是10ms。

为此非常须要高精度定时器使系统能在愈加精确的时间间隔中唤起和处理数据。

资源项目hrtimers-ThomasGleixner的补丁

支持高精度定时器的一个项目是ThomasGleixner的hrtimers

Thomas于2006年7月在加拿大的Linux研讨会上做了一个讲演展示了hrtimers的现况。讲演稿见这儿:

在2006年7月中国linux操作系统,“通用时钟源”被主线内核树(2.6.18-rc版本)所接受。这意味着在合适的时侯该特点会在2.6.18版本中出现。高精度定时器应当可能很快紧接着在2.6.19内核中出现。

在2006年2月,风河的JamesPerkins讲到:

ktimers被hrtimers所取代,hrtimers的主要部份被合并但是出现在Linux2.6.16-rc2版本中。hrtimers是itimers,nanosleeplinux 定时器 驱动,posix-timer的基础。JonathanCorbet在下文中挺好地展现了高精度定时器:

因为在2.6.16-rc2中只有hrtimers的核心linux格式化硬盘,hrtimers大体上使用系统的定时器作为她们的时钟源linux 定时器 驱动,以HZ运行。JohnStultz的通用时钟源代码并没有被合并。ThomasGleixner维护他的git库房而且典雅的发布到,它包含有通用的时钟源(clocksource),新的timeofday补丁,而且为一部份构架提供了真正的高精度定时器。

高精度定时器工作是实验性的并持续发展的,首先其聚焦于让X86先工作上去,倘若这种胜任你的要求,推荐使用2.6.16内核。该项目让我们晓得有什么问题和改进.相反的是,在2.6.8-2.6.10时期,GeorgeAnzinger领导的初期实现中提供了相当复杂的一套功能,而且这个项目当时并不活跃。

注意到现今HRT的维护者反对该特点。

HRT-GeogeAnzinger的补丁

定时器驱动舵机_定时器驱动无源蜂鸣器_linux 定时器 驱动

早于hrtimers,提供高精度定时器的主要是GeorgeAnzinger的补丁。官方的HRT补丁的页面在:

下载补丁实用程序怎样使用

为使用高精度定时器须要确认内核在目标处理器(或板子)支持该特点。但是你仍须要在Linux内核中配置以支持它。

可在你的内核配置中设置CONFIG_HIGH_RES_TIMERS=y

编译内核而且安装到你的目标板上。

为使用Posix的定时器API,请使用在线资源[1]

怎么检查你的定时器系统是否支持高精度定时器

有许多种方法可以判断你的系统是否支持高精度定时器

  1. $ cat /proc/timer_list
  2. Timer List Version: v0.3
  3. HRTIMER_MAX_CLOCK_BASES: 2
  4. now at 294115539550 nsecs
  5. cpu: 0
  6. clock 0:
  7. .index: 0
  8. .resolution: 1 nsecs
  9. .get_time: ktime_get_real
  10. .offset: 0 nsecs
  11. active timers:
  12. clock 1:
  13. .index: 1
  14. .resolution: 1 nsecs
  15. .get_time: ktime_get
  16. .offset: 0 nsecs
  17. active timers:
  18. #0: , tick_sched_timer, S:01, tick_nohz_restart_sched_tick, swapper/0
  19. # expires at 294117187500 nsecs [in 1647950 nsecs]
  20. #1: , it_real_fn, S:01, do_setitimer, syslogd/796
  21. # expires at 1207087219238 nsecs [in 912971679688 nsecs]
  22. .expires_next : 294117187500 nsecs
  23. .hres_active : 1
  24. .nr_events : 1635
  25. .nohz_mode : 2
  26. .idle_tick : 294078125000 nsecs
  27. .tick_stopped : 0
  28. .idle_jiffies : 4294966537
  29. .idle_calls : 2798
  30. .idle_sleeps : 1031
  31. .idle_entrytime : 294105407714 nsecs
  32. .idle_sleeptime : 286135498094 nsecs
  33. .last_jiffies : 4294966541
  34. .next_jiffies : 4294966555
  35. .idle_expires : 294179687500 nsecs
  36. jiffies: 4294966542
  37. Tick Device: mode: 1
  38. Clock Event Device: 32k-timer
  39. max_delta_ns: 2147483647
  40. min_delta_ns: 30517
  41. mult: 140737
  42. shift: 32
  43. mode: 3
  44. next_event: 294117187500 nsecs
  45. set_next_event: omap_32k_timer_set_next_event
  46. set_mode: omap_32k_timer_set_mode
  47. event_handler: hrtimer_interrupt

定时器驱动舵机_定时器驱动无源蜂鸣器_linux 定时器 驱动

下边有一些须要检测的事项:

检测你的时钟码率的报告。假如你的时钟支持高精度,这么.resolution值将是多少个ns。倘若不支持的话,.resolution值将等于1个tick对应的脉宽数(在嵌入式平台一般都是10000ns)。

检测时钟设备的event_handler。假如风波处理类库是hrtimer_interrupt时钟被设置成高精度。假如风波处理类库是tick_handle_periodic,这么时钟设备会设置成有规律的滴答。

检测timers的列表,看属性.hres_active的值是否为1。假如是1,高精度定时器的特点早已被激活了。

怎么验证

看前面关于cyclictest的描述

示例结果

[使用样例外加检测结果。]

案例学习1案例学习2状态未来工作/行动清单

linux 定时器 驱动_定时器驱动无源蜂鸣器_定时器驱动舵机

列举了未来可以为该分支做的一些事情:

陈旧的信息(2.4版本内核)(译者注:这儿不做翻译)

TheHighResolutionTimerssystemallowsauserspaceprogramtobewake

upfromatimereventwithbetteraccuracy,whenusingthePOSIXtimer

APIs.Withoutthissystem,thebestaccuracythatcanbeobtainedfor

timereventsis1jiffy.ThisdependsonthesettingofHZinthe

kernel.Inthe2.4kernel,HZwassetto100,whichmeansthatthebest

accuracyyoucouldgetonatimerwakeupinuserspacewas10

milliseconds.

定时器驱动舵机_linux 定时器 驱动_定时器驱动无源蜂鸣器

Putdifferently,ifyouaskedforatimereventin500microseconds,you

wouldwakeupin10milliseconds(atleast).

Tosupportthisfeatureonaparticularboard,youhavetoaddakernel

driverthatusesatimeronthesystemandsupportstheinterface

documentedin:include/linux/hrtime.h(intheCELFtree)Additional

documentationaboutthisfeatureisavailablein

Documentation/high-res-timers/

Patchesforhigh-restimerswerefirstpresentedatthetimeofkernel

version2.5.47,inNovember,2002.Seeearly

patches

分类:

本文原创地址://gulass.cn/egjddsqxmsxp.html编辑:刘遄,审核员:暂无