嵌入式体系是在有限的空间和有限的资源中运转,高效地完成某种特定功用或功用调集的设备。
它的开发一般遭到许多客观条件的约束,比如较弱的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是一个与体系结构有关的常数,在文件