原文:
翻译:@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的补丁
早于hrtimers,提供高精度定时器的主要是GeorgeAnzinger的补丁。官方的HRT补丁的页面在:
下载补丁实用程序怎样使用
为使用高精度定时器须要确认内核在目标处理器(或板子)支持该特点。但是你仍须要在Linux内核中配置以支持它。
可在你的内核配置中设置CONFIG_HIGH_RES_TIMERS=y
编译内核而且安装到你的目标板上。
为使用Posix的定时器API,请使用在线资源[1]
怎么检查你的定时器系统是否支持高精度定时器
有许多种方法可以判断你的系统是否支持高精度定时器
$ cat /proc/timer_list
Timer List Version: v0.3
HRTIMER_MAX_CLOCK_BASES: 2
now at 294115539550 nsecs
cpu: 0
clock 0:
.index: 0
.resolution: 1 nsecs
.get_time: ktime_get_real
.offset: 0 nsecs
active timers:
clock 1:
.index: 1
.resolution: 1 nsecs
.get_time: ktime_get
.offset: 0 nsecs
active timers:
#0: , tick_sched_timer, S:01, tick_nohz_restart_sched_tick, swapper/0
# expires at 294117187500 nsecs [in 1647950 nsecs]
#1: , it_real_fn, S:01, do_setitimer, syslogd/796
# expires at 1207087219238 nsecs [in 912971679688 nsecs]
.expires_next : 294117187500 nsecs
.hres_active : 1
.nr_events : 1635
.nohz_mode : 2
.idle_tick : 294078125000 nsecs
.tick_stopped : 0
.idle_jiffies : 4294966537
.idle_calls : 2798
.idle_sleeps : 1031
.idle_entrytime : 294105407714 nsecs
.idle_sleeptime : 286135498094 nsecs
.last_jiffies : 4294966541
.next_jiffies : 4294966555
.idle_expires : 294179687500 nsecs
jiffies: 4294966542
Tick Device: mode: 1
Clock Event Device: 32k-timer
max_delta_ns: 2147483647
min_delta_ns: 30517
mult: 140737
shift: 32
mode: 3
next_event: 294117187500 nsecs
set_next_event: omap_32k_timer_set_next_event
set_mode: omap_32k_timer_set_mode
event_handler: hrtimer_interrupt
下边有一些须要检测的事项:
检测你的时钟码率的报告。假如你的时钟支持高精度,这么.resolution值将是多少个ns。倘若不支持的话,.resolution值将等于1个tick对应的脉宽数(在嵌入式平台一般都是10000ns)。
检测时钟设备的event_handler。假如风波处理类库是hrtimer_interrupt时钟被设置成高精度。假如风波处理类库是tick_handle_periodic,这么时钟设备会设置成有规律的滴答。
检测timers的列表,看属性.hres_active的值是否为1。假如是1,高精度定时器的特点早已被激活了。
怎么验证
看前面关于cyclictest的描述
示例结果
[使用样例外加检测结果。]
案例学习1案例学习2状态未来工作/行动清单
列举了未来可以为该分支做的一些事情:
陈旧的信息(2.4版本内核)(译者注:这儿不做翻译)
TheHighResolutionTimerssystemallowsauserspaceprogramtobewake
upfromatimereventwithbetteraccuracy,whenusingthePOSIXtimer
APIs.Withoutthissystem,thebestaccuracythatcanbeobtainedfor
timereventsis1jiffy.ThisdependsonthesettingofHZinthe
kernel.Inthe2.4kernel,HZwassetto100,whichmeansthatthebest
accuracyyoucouldgetonatimerwakeupinuserspacewas10
milliseconds.
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
分类:
本文原创地址://lrxjmw.cn/egjddsqxmsxp.html编辑:刘遄,审核员:暂无