首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
采用混合时钟模式提高Linux时钟精度的方法
来源:本站整理  作者:佚名  2011-05-22 10:00:52



数控技术(CNC)已经成为现代制造业的核心技术之一,开放式数控系统相对于传统数控系统在功能、灵活性、成本等方面的优势,使得开放式数控成为数控系统未来发展的主要趋势。目前,开放式数控系统主要有三种结构,即专用CNC+PC、通用PC+运动控制器和软数控系统。其中软数控系统采用多任务实时操作系统,将运动控制部分与管理部分集成到一个硬件平台上,满足数控系统在功能方面和非功能方面(主要表现在实时性)的要求[1]。开放式数控系统的理想软件平台是实时多任务操作系统,目前,商业实时多任务操作系统有很多,比较著名的有VxWORKS、iRMX、QNX等,但这些操作系统产品大多成本高、开放性差。Linux是一种发展十分迅速的类UNIX系统,已被广泛地运用到服务器、桌面系统以及嵌入式应用领域。Linux由于其开放源代码的特点,可以在此基础上开发具有自主知识产权的数控系统。但是Linux最初的设计目标是一个分时操作系统,追求系统效率和公平性,在对实时性要求高的领域应用受到限制。虽然2.6内核的Linux时钟粒度提高到了1 ms,但仍远不能满足数控系统对定时精度的要求。
 近年来的研究以细化时钟粒度来提高Linux的实时应用能力提出了一些方案和设想,主要有KURT-Linux系统、RT-Linux系统。本文对KURT_Linux、RT-Linux提高时钟精度的方法进行分析,考虑在强周期性应用或者在某个时段内有大量高精度定时器将超时的情况下,采用一种动态的多模式时钟机制来提高Linux的时钟精度,并通过分析测试证明该方案确实可行。
1 Linux时钟机制与改进
1.1 Linux时钟机制

 时钟和定时器对Linux系统来说是至关重要的。首先,内核要管理系统的运行时间以及墙上时间;其次,内核中大量的任务是基于时间驱动,其中有些任务是周期执行,如对调度程序中运行队列进行平衡调整或对屏幕进行刷新,而有些任务需要推后执行的I/O操作则需要等待一个相对时间后才运行。
 系统时钟是定时器硬件和系统软件的结合,在X86体系结构中,使用最普遍的定时器硬件是Intel8254可编程定时器芯片(PIT),它产生的中断就是时钟中断(tick)。时钟中断是特定的周期性中断,对应中断服务程序,完成更新系统时间以及任务的管理、调度等工作;系统在每次时钟中断处理中更新jiffies,维护系统定时器链表timer_list,对超时的定时器进行处理。
 与系统定时器相对的是动态定时器,是用来调度事件在将来某个时刻发生的机制。它依赖于系统时钟中断,在时钟中断服务程序的下半部,系统检查是否有超时的动态定时器并进行处理。linux2.6内核的系统时钟频率为1 000 Hz,即时钟中断的触发周期为1 ms,中断服务程序最快每1 ms执行一次。动态定时器随时都可能超时,但只有在中断服务处理程序执行时才会检查、执行超时的动态定时器,所以动态定时器的平均误差大约为半个系统时钟周期。
 CNC数控系统的工作过程通常是首先内建一个定时器(由操作系统完成),然后周期性地执行控制程序,周期通常为几十微秒到十几毫秒。在每个周期内要完成状态监测、译码、刀具补偿计算、插补计算、PLC管理、位置控制等工作。可见,在加工工件过程中,CNC要求的实时性非常高,必须在很短、很精确的周期内完成一系列的计算和输入输出,否则加工精度无法得到保障。标准2.6内核Linux定时器精度远远达不到数控系统周期实时任务要求的微秒级定时精度。
1.2 提高时钟精度的办法
 近年来人们对Linux进行实时化改造提出了一些方案和设想,主要有KURT-Linux、RT-Linux等[2]。下面分别进行介绍。
 KURT_Linux[3]由kansas大学开发,通过对Linux内核内部进行改造来满足实时应用需求。在时钟精度方面,KURT-Linux将Linux的时钟中断固定模式改为单次触发模式(one-shot mode),即每次给时钟芯片设置一个超时时间,然后等到该超时事件发生,在时钟中断处理过程中再次根据需要设置一个超时时间。通过这种变长时钟模式,将Linux时钟精度提高到μs级。既保证了特定实时任务的精度要求,又避免了不必要的调度负担。
 RT-Linux是新墨西哥工学院研制的一个基于Linux的硬实时系统。它采用双内核方法,在原有Linux基础上设计一个专门处理实时进程的内核,然后把整个Linux作为实时内核上运行的一个低优先级进程。在时钟精度方面类似KURT_Linux,将系统实时时钟设置为单次触发状态,然后利用TSC提供高达CPU时钟频率的定时精度。
Monta Vista Linux是由James Ready领导开发的嵌入式Linux,通过对Linux内核进行内部改造,直接修改原有Linux内核的数据结构等来满足实时需要。在高精度时钟方面,抛开传统的周期中断CPU的方法,使定时器在需要的任何一个μs产生中断,但不在每个μs产生中断,将系统的定时精度提高到μs级。
 Linux-SRT是剑桥大学David Ingram的博士论文项目,它简单地修改了Linux中Hz的定义,将Linux时钟频率由100 Hz提高到1 024 Hz。这种方式实现起来很简单,但是由此带来频繁的定时中断使得系统开销很大。
借鉴KURT-Linux的one-shot思想来提高时钟精度,并利用高级可编程中断控制器(APIC)[4]或通过附加的硬件资源实现一个与系统时钟并行的高精度实时时钟,在系统中维护一个高精度实时时钟和一个低精度系统时钟[5-7],是一种普遍采用的提高时钟精度的方法。但是在缺乏附加硬件支持或APIC使用受限的应用环境下,只能利用PIT芯片作为高精度时钟源,在每次中断处理时要重新计算下一次中断时间和对PIT进行编程。由于PC的兼容性,PIT芯片位于低速的ISA总线上,频繁设置定时器硬件也需要耗费大量的时钟周期。因此one-shot模式时钟中断处理时间可能达到标准Linux时钟中断处理时间的7~15倍[8-9]。在强周期应用或有大量定时器集中在某个时段内时超时,需要采取一种不同于one-shot的时钟模式。
 如果系统中没有任何实时定时器,则系统每隔1 ms会有一次周期性jiffies时钟中断,采用one-shot模式使得系统性能下降大约1.5%。如果系统中没有任何实时定时器,则需要重新将时钟设置为RTL CLOCK MODE PERIODIC工作模式,并且时钟周期和标准Linux下时钟周期一致,使Linux能在系统中不存在实时任务的情况下高效地工作。
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所示。

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:61,382.81000 毫秒