2 动态高精度时钟设计和实现

动态高精度时钟设计方案借鉴了KURT-Linux思想,但与其不同的是提供一个与标准Linux核心时钟并行的具有精密刻度的实时时钟,并与原核心时钟区别开。采用X86体系CPU提供的TSC作为高精度的时间标度,权衡一定时间段(如一个jiffies)内高精度定时器的数量,设置Linux时钟中断模式为标准模式、one-shot模式或高频周期时钟模式。实现了μs级定时精度的同时,降低了频繁计算和设置时钟芯片的时间代价。

下面给出关键的全局变量:

(1)time_mode:表示当前时钟工作模式。其中-1代表高频周期时钟模式,该模式下,根据需要达到的定时精度,设置时钟芯片以较高的频率产生周期性中断;0代表标准模式,时钟芯片以标准Linux默认的频率产生周期中断;1代表one-shot模式,时钟芯片被设置为单次触发状态,即每次给时钟芯片设置一个超时时间,超时事件发生时,在时钟中断处理程序中根据需要再次给时钟芯片设置一个超时时间。系统启动时设置为默认值0。

(2)SCALE:时钟精度提高比。设置高频周期模式需要的参数,用来表示所需要达到的时钟精度相对普通Linux时钟精度的提高倍数。

(3)Threshold:阈值。如果即将在某一时间段内超时的实时定时器数量大于预设值,系统设置硬件定时器工作在高频周期时钟模式。

2.1 时钟中断处理

为了加强Linux的实时功能,同时又要保持Linux的完整性,本方案的动态多模式时钟机制以模块化的方式实现有关实时部分的功能,并利用接口函数实现实时模块与Linux核心的联系。

(1)标准模式。标准模式下的中断处理首先查询实时定时器队列中是否有实时定时器在下一个系统时钟中断(jiffies+1)之前超时,即在(jiffies,jiffies+1)内是否有实时定时器要处理,根据实时定时器数量设置时钟芯片的工作模式,执行do_timer_interrupt()等函数维护系统相关时间,标记下半部。

(2)one_shot模式。one-shot模式下的中断处理先判断jiffies时钟是否到期,如果到期:

①查询实时定时器队列中是否有实时定时器在下一个系统时钟中断(tick+1)之前超时,即在(jiffies,jiffies+1)内有实时定时器要处理(其超时时间用sub_jiffies表示),然后根据实时定时器数量设置时钟芯片工作模式。

②执行do_timer_interrupt()函数等维护与系统有关的时间,并标记下半部。

如果jiffies时钟未到期,则查询实时定时器链表,根据其最早超时实时定时器的超时时间与当前时间的差值设置时钟芯片产生下一次中断的时间。

(3)高频周期时钟模式。高频周期模式下中断处理先判断jiffies时钟是否到期,如果系统时钟节拍到期,执行上述①、②模式。否则,如果有实时定时器超时,标记中断下半部;如果没有实时定时器超时则直接返回。

对超时定时器的处理都留到时钟中断下半部(softirq)处理,超时的实时定时器优先得到处理,以尽可能保证实时定时器的及时处理,随后处理普通Linux的定时器,时钟中断处理过程如图1所示。

2.2 定时器组织

普通Linux系统原有的粗粒度定时器对于内核的稳定和不要求高精度定时的非实时应用仍是合适的,只是针对有高精度定时要求的实时应用组织一个高精度定时器队列HRT_list,队列中的定时器按超时时间非降序排列,队列中第一个定时器的超时时间就是队列的最早超时时间。

原Linux内核中的定时器是通过称为CTW(Cascading Timer Wheel)的结构管理和维护,并因此使得对定时器的插入、删除等操作的时间为0(1)。本文把HRT_list队列和CTW结合起来以降低定时器处理时间、提高效率。把需要较长时间才超时的实时定时器仍旧插入到原定时器队列中,借助该队列维护。在每次系统时钟中断处理的下半部处理完超时的实时定时器后,把在下一次系统时钟中断前超时的高精度定时器从原队列移除,并插入到HRT_list队列中。因此,HRT_list队列中所需要维护的高精度实时定时器也是有限的,避免了维护一个大规模定时器队列的开销,近似实现了0(1)的系统开销。

3 性能分析与测试

3.1 性能分析

当系统中没有高精度定时器时,PIT仍以Linux系统默认的频率触发时钟中断,在每一次系统时钟中断处理过程中,只需要判断工作模式以及下一次jiffies中断前有否实时定时器超时,经测试由此而带来的处理时间不超过1us,增加系统负担<0.1%,不会影响系统的性能。当在某个时间段内系统中实时定时器不多于阈值时,系统时钟工作在类似KURT-Linux的one-shot模式,同时维持普通Linux系统时钟的稳定。而由此而带来的系统负担是可以接受的[3]。

当系统中存在大量实时定时器或在某个时间段内即将超时的实时定时器数量超过一定值(阈值)时,相对于one-shot模式需要频繁地计算下次中断时间,并重新编程在低速的ISA总线上的PIT的时间代价是可取的,证明如下:

用Thw表示中断的硬件处理时间,Tisr表示中断程序上半部执行时间,n代表某个时段内(一个jiffies内)超时的定时器数量。得到两种模式下总的时钟中断处理时间关系式:

显然,当某个时段内超时的定时器数量大于Threshold时,采用高频周期模式的时间开销就会小于one-shot模式。

3.2 模拟测试

测试环境为Pentium4 3.0 GHz CPU,1GDDR内存的硬件平台和2.6.15.6版本内核的Fedora core linux操作系统平台。

根据数控实时任务的要求设定了周期为0.1 ms、1 ms和100 ms的进程模拟数控实时周期任务[10],统计运行1 000次的数据,比较改进后的高精度定时器和原linux定时器的平均定时偏差,并令阈值为30,设置周期任务数量为4、20、40,使时钟工作在不同模式下。测试结果如表1所示。

由测试数据对比,原linux系统的定时平均偏差为968 μs,改进后系统的定时平均偏差为34 ?滋s。显而易见,改进后的定时器定时精度大大提高,达到10 μs级,能满足数控系统应用的要求。

在原Linux内核和改进后的高精度定时器内核上睡眠50 μs各1 000次,测试实际睡眠时间所得结果与表1类似,50 μs的实际睡眠时间从(2.001~2.116) ms级降到(57~91) μs级。

全软件数控系统以应用软件的形式实现运动控制,是开放式数控系统的发展方向。开源的Linux是开发具有自主知识产权数控系统的理想平台,但是其粗糙的时钟粒度是普通Linux直接应用于数控系统的最大障碍,因此需要细化Linux的时钟粒度提高其实时性。

简单地提高系统时钟频率将引起频繁的中断处理,导致系统性能的下降。KURT-Linux采用的one-shot方式将周期性的时钟中断改进为单次触发状态,实现了μs级的定时精度。本文分析了普通Linux时钟机制和几种实时Linux操作系统细化时钟精度的方式,提出了一种混合多种时钟模式的动态时钟机制,达到了CNC要求的时钟精度。最后的性能分析和模拟测试证实了新时钟机制的技术性能。

参考文献

[1] 李迪,万加富,叶峰,等.软数控系统混合任务两级调度策略[J].机械工程学报,2008,44(12):157-162.

[2] 王霞,马忠梅,何小庆,等.提高嵌入式linux时钟精度的方法[J].计算机工程,2006,32(23):70-96.

[3] 施映,何嘉.KURT-Linux实时性研究及改进策略[J].计算机科学,2006,33(7):417-420.

[4] 丁一,胡封林,李国宽.高级可编程中断控制系统的研究[J].计算机工程与科学,2005,27(12):97-100.

[5] 范剑英,吴岩,贾佳,等.Linux2.6实时性分析与改进方案[J].哈尔滨理工大学学报,2008,13(1):24-28.

[6] 於时才,缪东升,孙华,等.Linux2.6调度系统的分析与改进[J].微计算机信息,2007,24(5-3):252-254.

[7]周鹏,周明天.linux内核中一种高精度定时器的设计与实现[J].计算机技术与发展,2006,16(4):73-78.

[8] SRINIVASAN B, PATHER S, HILL R, et al. A firm real-time system implementation using commercial off-the-shelf hardware and free software[R]. rtas. Fourth IEEE Real-Time Technology and Applications Symposium (RTAS’98), 1998.

[9] 李小群,赵慧斌,叶以民,等.一种基于时钟粒度细化的Linux实时化方案[J].计算机研究与发展,2003,40(5):734-740.

[10] 姚鑫骅,潘雪增,傅建中,等.数控系统的混合任务模型及其最优调度算法研究[J].浙江大学学报,2006,40(8):1315-1319.

如何提高linux的时钟精度,Linux时钟精度提高有什么办法?相关推荐

  1. 火牛单片机rtc时钟配置_RTC 实时时钟驱动 - Linux内核之我的天下 - CSDN博客

    RTC实时时钟驱动 -------I2C软件模拟通信 内核版本: linux-2.4.21 文档设计:侯辉华 版本: 1.01 时间: 2007/06/10 内容简介:介绍接在I2C总线上RTC实时时 ...

  2. linux下编写时钟代码,Linux时间子系统之一:clock source(时钟源)【转】(示例代码)...

    clock source用于为linux内核提供一个时间基线,如果你用linux的date命令获取当前时间,内核会读取当前的clock source,转换并返回合适的时间单位给用户空间.在硬件层,它通 ...

  3. 关于linux内核中使用的时钟

    linux内核里面用了很多的时钟,其实这些时钟的用处无外乎就几种:1.作为心跳,中断cpu:2.使得用户可以获取当前时间:3.实时测量:4.定时 服务.知道了使用目的后,我们来看看到底有哪些时钟供我们 ...

  4. 【原创】xenomai+linux双内核下的时钟管理机制

    双内核下的时钟管理机制 版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 文章目录 双内核下的时钟管理 ...

  5. 一文搞懂linux时间片,硬件时钟,软件时钟,实时时钟,时间中断,墙上时间

    时间片: ​ 时间片是一个数值,它表明程序在被抢占前所持续运行的时间. 相对时间绝对时间区别: ​ 如果某个时间在5s后呗调度执行,那么系统所需要的不是绝对时间,而是相对时间(比如,相对现在5s后): ...

  6. linux内核配置高精度时钟,关于linux内核中使用的时钟

    linux内核里面用了很多的时钟,其实这些时钟的用处无外乎就几种:1.作为心跳,中断cpu:2.使得用户可以获取当前时间:3.实时测量:4.定时 服务.知道了使用目的后,我们来看看到底有哪些时钟供我们 ...

  7. linux的系统时钟,【总结】linux系统时间和硬件时钟问题

    ####一.弄清几个概念: 1. "系统时间"与"硬件时间" **系统时间:** 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用 ...

  8. linux内核个性化,linux内核中的个性时钟nohz与hres

    设计linux内核的那帮家伙想的可真周到啊,前面说过,linux内核的性格就是激情,只要硬件设计的足够灵活,那么设计者就会尽可能的发挥,不放过任 何可自由发挥的点和死角,而且他们从来不管后果,有时还毅 ...

  9. linux系统时间和硬件时钟时间 FAQ

    Linux有两个时钟, 一个是system time, 一个是hardware clock. 使用date和hwclock命令可分别查看和设定系统时间和硬件时间. The Hardware Clock ...

  10. Linu命令 hwclock,clock,设置硬件时钟,linux硬件时间

    Linu命令 hwclock,clock hwclock作用与clock相同,暂未发现不同之处. 相关的常用命令: 查看硬件时钟: [root@192 temp]# clock 2020年10月09日 ...

最新文章

  1. Django框架之Auth模块
  2. goland 设置project gopath
  3. Java中类、方法声明为静态的含义
  4. Fully Convolutional Networks for semantic Segmentation(深度学习经典论文翻译)
  5. play版 高德地图google_iOS 12 发布,苹果 CarPlay 终于开始支持谷歌、高德导航
  6. Android学习总结(4)——Andorid Studio熟练使用
  7. 使用httpwatch抓包
  8. 修改10g自动统计信息收集作业GATHER_STATS_JOB到仅仅周末执行
  9. 回溯法求解背包问题java_背包问题回溯法的递归实现(java)
  10. 微信小程序的bindtap和catchtap实际场景 对话框中按钮点击和对话框背景点击处理笔记...
  11. 如何使用Easy-POI导入复杂表头的Excel报表(含源码级分析)
  12. 1602液晶显示简易计算器
  13. [AV1] AV1技术专栏(正在更新中)
  14. 好吧,cnblogs给我的下马威
  15. 请说说你对互联网行业的理解。
  16. 关于OC语言基础的总结
  17. vue出现您是否正确注册了组件? 对于递归组件,请确保提供“名称”选项。或者you register the component correctly? For recursive components
  18. (轉貼) 送给c++程序员的一份礼物——常用工具集 (C/C++)
  19. CnOpenData中国专利IPC分类号数据(世界版)
  20. 鼠标中间无法打开新标签_高性价比利器—赛睿RIVAL3 WIRELESS无线鼠标评测

热门文章

  1. cnsl是什么意思_VS2010下创建静态链接库和动态链接库
  2. element 搜索匹配_分享一个element-ui级联选择器的搜索问题,顺便问下有没有解决方案。...
  3. 做一个关于我和她微信聊天记录的爱心词云图
  4. linux装redis环境变量,linux 怎样安装redis
  5. 未来教育计算机二级书怎么样,未来教育计算机二级
  6. python123自定义幂函数_python基础之函数
  7. 如何找到python的安装路径_如何查看python的安装路径
  8. 高德地图怎么搜索marker_2018-07-06 高德地图搜索定位,滑动地图显示周边信息,根据地址搜经...
  9. Python读取写入yaml文件
  10. (转)递归转非递归的思路和例子