您的位置 首页 FPGA

以Linux 2.6为根底的进步Linux实时性的办法讨论

以Linux 2.6为基础的提高Linux实时性的方法探讨-它的开发通常受到很多客观条件的限制,诸如较弱的CPU处理能力、较小的内存空间、较少的可供选择的外设、有限的电源供应等。每个嵌入式系统的开发无不是精打细算,以求用有限的资源发挥最大的功效。在各种嵌入式系统上运行的操作系统中,嵌入式Linux以其免费、高可靠性、广泛的硬件支持以及开放源码等众多特性正在获得越来越多的关注。其源码开放特性使得开发者可以针对特定的嵌入式系统对Linux内核进行修改,以满足开发要求,达到系统最优化的目的。嵌入式Linux应用中的一大问题是Linux的实时性问题。实时系统必须在限定时间内对外部事件作出正确响应,重点放在对满足突发性、暂时性的处理需求上。而Linux作为传统的分时操作系统,关注更多的是系统的整体数据吞吐量。如何提高Linux的实时性能是摆在广大嵌入式系统级开发人员面前的挑

嵌入式体系是在有限的空间和有限的资源中运转,高效地完成某种特定功用或功用调集的设备。

它的开发一般遭到许多客观条件的约束,比如较弱的CPU处理才干、较小的内存空间、较少的可供挑选的外设、有限的电源供给等。每个嵌入式体系的开发无不是克勤克俭,以求用有限的资源发挥最大的成效。在各种嵌入式体系上运转的操作体系中,嵌入式Linux以其免费、高可靠性、广泛的硬件支撑以及敞开源码等许多特性正在取得越来越多的重视。其源码敞开特性使得开发者可以针对特定的嵌入式体系对Linux内核进行修正,以满意开发要求,到达体系最优化的意图。嵌入式Linux运用中的一大问题是Linux的实时性问题。实时体系有必要在限制时刻内对外部事情作出正确呼应,要点放在对满意突发性、暂时性的处理需求上。而Linux作为传统的分时操作体系,重视更多的是体系的全体数据吞吐量。怎么进步Linux的实时功能是摆在广阔嵌入式体系级开发人员面前的应战。

1 相关研讨

现在市道上有各种Linux发行版,但严格来说,Linux指的是Linus Torvalds保护的(及经过首要和镜像网站发布的)内核。树立嵌入式体系不需求特别的内核,一个嵌入式Linux体系仅仅代表一个依据Linux内核的嵌入式体系,本文后边提及的Linux均指Linux内核。现在已有许多改进Linux实时功能的作业在进行中。最新的2.6版Linux现已完成了可抢占式的内核使命调度,可是不确认的中止延时问题没有得到处理。即2.6版的Linux高优先级内核空间进程虽然能像在用户空间里那样抢占低优先级进程的体系资源,可是从中止宣布开端到中止服务程序的第1条指令开端履行的时刻是不确认的。

除了Linux开发者的改进作业之外,还有一些安排、公司为进步Linux的实时性做了许多作业。其间有代表性的是Fsm Labs公司的RT-Linux、Monta Vista公司的MontaVista Linux、由Paolo Mantegazza等人保护的RTAI(Realtime ApplicaTIon InteRFace)项目。这些项目选用的办法可概括为两类:

(1)直接修正Linux内核。MontaVista Linux选用的便是这种办法。它将Linux修正成称为RelaTIvely Fully Preemptable Kernel的可抢占式内核,并使现了实时调度机制和算法,添加了一个细粒度守时器,这样就将Linux修正成为一个软实时内核。

(2)“双内核”办法。RTAI项目和RT-Linux选用了这种办法。这种办法将传统Linux“架空”,作为新添加的小型实时内核的一个优先级最低的使命履行,而实时使命则作为优先级最高的使命。即在实时使命存在的状况下运转施行使命,不然才运转Linux本身的使命。

MontaVista和RT-Linux的局限性在于它是一个商用软件,不遵从GNU 的源代码敞开准则。若要在体系中运用这种Linux,则需求付出一笔较为可观的授权费用,这就违反了运用Linux的初衷—— 开源、免费,可以开展自己的知识产权。

RTAI为了实时功能放弃了Linux固有的许多长处:对许多硬件的广泛支撑,优异的稳定性、可靠性。开发者一方面要针对RTAI自界说的一个硬件笼统层RTHAL(Real TIme Hardware AbstracTIon Layer)从头编写驱动程序,而且巨大的Linux开发社区的效果也无法方便地运用到实时核心中。

2 影响Linux实时性的要素

2.1 使命切换及其延时

使命切换延时是Linux从一个进程切换到另一个进程所需的时刻,即高优先级进程从宣布CPU 资源申请到进程的第1条指令开端履行的距离。在实时体系中,使命切换延时有必要越短越好。如之前所说到的,Linux 2.6.X现已完成了可抢占式内核,高优先级内核空间进程可以像在用户空间中那样让CPU在任何时分中止低优先级进程转而履行自己。可是有2种例外状况:

(1)进程在临界区(Critical Section)中履行的时分不能被其他进程抢占;

(2)中止服务程序(Interrupt Service Routine)不能被其他进程抢占。

2.2 依据优先级的调度算法

在Linux 2.6中,选用了O(1)调度算法。它是一个依据优先级的抢先式调度器,为每一个进程分配一个仅有的优先级,调度器确保在所有等候运转的使命中,首要被履行的总是高优先级的使命,为此高优先级的使命可以抢占低优先级的使命。

这个调度器开支稳定,与当时体系开支无关,可以改进体系实时功能。可是调度体系没有供给除CPU以外的其他资源掠夺运转,实时功能没有得到底子改观。假如两个使命需求运用同一个资源(如高速缓存),高优先级的使命已准备就绪,而此刻低优先级的使命正在用这个资源,高优先级的使命就有必要等候,直到低优先级使命完毕开释了该资源后才干被履行,这被称为优先级倒置。

2.3 中止延时、中止服务程序

中止延时指的是从外设宣布中止信号开端到ISR的第1条指令开端履行的时刻距离。由外部中止引起的实时使命需求是实时体系处理量的首要组成部分,满足快地中止呼应和迅速地中止服务程序处理是衡量实时体系的重要功能指标。不同的ISR履行时刻是不一样的,即便是相同的ISR也或许因为有多个出口而有不同的履行时刻。而ISR履行时外部中止是被禁用的,形成这样一种状况,即便Linux的中止延时十分小,假如在一个ISR履行时某个外设也产生了一个中止信号,因为正在履行的ISR运转时刻的不确认性和不行抢占性,也会产生Linux的中止延时的不行猜测性。

3 体系实时功能的进步

3.1 使命切换机倒的树立

在2.1节中说到进程在临界区中履行的时分不能被抢占的问题,为了不影响体系稳定性、削减调试和测验的时刻,咱们不计划对此进行修正,而引进一个机制确保实时使命可以得到优先履行。即在实时体系中,只有当进程的临界区能在下一个实时使命开端之前完毕才被答应进入。

怎么判别下一个实时使命中止信号的产生时刻,一般来说中止信号是为了那些开端时刻不行猜测的使命而设定的,它的产生是彻底随机的。为了使中止信号的时刻可以被猜测,将中止信号的产生与时钟中止挂钩:中止信号只能与时钟中止一起产生。时钟中止由体系计时硬件以周期性距离产生。这个距离由内核依据Hz值设定。Hz是一个与体系结构有关的常数,在文件中界说。当时的Linux为大多数渠道界说的Hz值是100,亦即时钟中止周期是10ms。显着这是达不到实时体系守时精度要求的。进步Hz值可以带来体系功能进步,但却是以添加体系开支为价值。这就有必要细心权衡实时性要求和体系开支的平衡。一种办法是经过许多的测验确认的实时使命中止请求产生的时刻距离和进程在临界区中的履行时刻,取一个稍大于大多数实时使命中止距离和临界区履行时刻的数值。

Linux供给了一些机制让咱们得以核算函数的履行时刻,gettimefoday()函数是其间之一。函数的原型及需求运用的一个数据结构如下:

以Linux 2.6为根底的进步Linux实时性的办法讨论

其间,gettimeofday()将当时时刻保存在tv结构中,tz一般不需求用到,可用NULL替代。运用示例如下:

以Linux 2.6为根底的进步Linux实时性的办法讨论

如此即可得出进程在临界区function_in_critical_section()所消耗的时刻,以供参阅。将Hz值设定在2000,此刻体系时钟中止周期为0.5ms,精度进步了20倍。

如图1、图2所示,当进程进入临界区之前,它比较本身的均匀履行时刻T(NP)和T(REMAIN)的值,当T(NP)≤T(REMAIN)的时分,进程才被答应进入临界区,不然进程进入作业行列等候下一次判别。

以Linux 2.6为根底的进步Linux实时性的办法讨论

本文尝试用数学办法来剖析选用这种机制对实时功能的进步。首要给出一个界说:当预定在时刻t时履行的实时使命推延到时刻t‘时才履行,则t’-t称作体系推迟,用Lat(OS)表明。在一般Linux中,Lat(OS)如下:

Lat(OS)=T(NP)+ T(SHED)

设恣意时刻 ,T(NP)≤T(REMAIN)的机率为ρ,则一般Linux中的均匀Lat(OS)为

AvLat(OS)=ρ[T(NP)+ T(SHED)] +(1-ρ)[T(NP)+ 2T(SHED)]

引进前述机制后,因为总是优先确保实时使命的履行,Lat(RT-OS)固定式为:

Lat(RT-OS)=T(SHED)

选用该机制前后体系廷迟的变化为

δ=AvLat(NOR-OS)-Lat(RT-OS)=T(NP)+(2-ρ)T(SHED)

在一个特定体系里,ρ是固定的,而在Linux 2.6中,选用O(1)算法后T(SHED)也是固定的,由前式可得出结论:在临界区的进程履行时刻长的体系中,引进该机制前后均匀体系廷迟下降的越大,体系实时功能的改进越显着。

3.2 优先级量顶

试描绘一个如下场景:低优先级的使命L和高优先级H使命需求占用同一同享资源,低优先级使命开端后不久,高优先级使命也准备就绪,发现所需同享资源被占用后,使命H被挂起,等候使命L完毕开释该资源。此刻一个不需求该资源的中优先级使命M 呈现,调度器依据优先准则转而履行使命M。这就进一步廷长了使命H的等候时刻,如图3所示。愈加恶劣的状况是,假如呈现了更多的相似使命M0,M1,M2,。..,将有或许使使命H错失临界期限(Critical Deadline),而导致体系溃散。

在一个不太杂乱的实时体系中,可选用优先级置顶的办法处理这一问题。该计划对每一个或许被同享的资源分配一个优先级,该优先级为有或许运用这个资源的最高优先级的进程的优先级(如下伪代码中的RESOURCE_X_PRIO)。由调度器将优先级传给运用该资源的进程,进程完毕后其本身的优先级(如下伪代码中的TASK_A_PRIO)才康复正常。这样就避免了上面场景中使命L被使命M抢占,而导致使命H一直处于挂起状况。优先级置顶的示例代码如下:

以Linux 2.6为根底的进步Linux实时性的办法讨论

3.3 内核线程

中止服务程序(ISR)是不能被抢占的。一旦CPU 开端履行ISR,除非程序完毕,不然不或许转而履行其他的使命。Linux用自旋锁(Spinlock)来完成ISR对CPU的独占。选用了自旋锁的ISR是不能进入休眠的,而且此刻体系的中止也被彻底制止。内核线程是由内核创建和吊销的,用来履行一个指定的函数。内核线程具有自己的内核仓库,可以被独自调用。咱们用内核线程替代ISR,而且用互斥量(Mutex)替换自旋锁。内核线程可以进入休眠,而且履行时是不禁用外部中止的。体系接到中止信号后,唤醒相应的内核线程,内核线程替代本来的ISR履行完使命后持续进入休眠状况。这样中止廷时便是可猜测的,而且占用时刻也很少。

依据LynuxWorks公司的测验数据,在Pentium III 1GHz的PC上,Linux 2.4内核的均匀使命呼应时刻为1133us,均匀中止呼应时刻为252us;而Linux 2.6内核的均匀呼应时刻为132us,均匀中止呼应时刻仅为14us,比Linux 2.4内核进步了一个数量级。在此根底上,选用这种办法可以针对详细的体系进一步加速特定中止的呼应时刻,进步运用体系的实时功能。

4 总结与展望

本文以Linux 2.6为根底讨论了进步Linux实时性的办法。引进了在实时体系中,只有当进入临界区的进程能在下一个实时使命开端之前完毕时才被答应履行的机制,确保实时使命总是优先得到履行;选用了优先级置顶的办法避免了呈现优先级倒置的状况;用内核线程替代中止服务程序,改动了了一般中止服务程序履行中不能进入休眠状况的状况,而且履行时不禁用外部中止,使体系的中止廷时变得矮小和可猜测。本文所述办法的缺陷在于,进步体系时钟中止频率带会增大体系开支问题。为了在实时功能进步和体系开支增大之间找到一个平衡点,开发者不得不对详细体系做许多测验,详细问题详细剖析,使得该办法在适用性上打了扣头。Linux因其免费、功能强壮、东西许多的特色,必将在嵌入式体系范畴得到许多的运用。咱们应该及时盯梢国内外Linux开展动态,一起堆集在此范畴的开发经历,走出自己的路来。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/100466.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部