挑选一个适宜的嵌入式操作体系,能够考虑以下几个要素:
第一是运用。假如你想开发的嵌入式设备是一个和网络运用密切相关或许便是一个网络设备,那么你应该挑选用嵌入式Linux或许uCLinux,而不是uC/OS-II。
第二是实时性。没有一个肯定的数字能够告知你什么是硬实时,什么是软实时,他们之间的边界也是十分含糊的,这与你挑选什么样的CPU,它的主频、内存等参数有必定联系。假如你运用参加实时补丁等技能的嵌入式Linux,如Monta Vista Linux(2.4.17版别),最坏的状况只要436微秒,而99.9%的状况是195微秒以内。考虑到最新的Linux在实时性方面的改善,它能够适宜于90~95%的各种嵌入式体系运用。当然,你假如希望更快的实时呼应,如高速A/D转化需求几个微秒以内的中止延时,或许选用uC/OS-II是适宜的。当然,选用像Vxworks这样传统的嵌入式操作体系也能够满意这样的强实时性要求。
Linux体系作为一个GPOS(通用操作体系)开展至今现已十分老练可靠了,并且由于遵从GPL协议,敞开一切体系源代码,十分易于裁剪。更重要的是,与其他开源的GPOS或RTOS比较,Linux体系支撑多种处理器、开发板,供给多种软件开发工具,一起Linux体系对网络和图形界面的支撑十分超卓。明显,挑选Linux操作体系在产品的开发周期和本钱操控方面都有巨大优势。
Linux支撑的硬件设备品种繁复。Linux支撑十分多的运用程序和网络协议。Linux的扩展性很好,从小型的消费电子产品到大型、粗笨的电信级交换机和路由器都能够选用Linux。和传统的专有嵌入式操作体系不同,布置Linux不需求交纳专利费。Linux招引了为数众多的活泼的开发者,能很快支撑新的硬件架构、渠道和设备。越来越多的硬件和软件厂商,包含简直一切的尖端芯片制作商和独立软件开发商,现在都支撑Linux。
实时体系的典型界说如下:“所谓实时体系,便是体系中核算成果的正确性不只取决于核算逻辑的正确性,还取决于产生成果的时刻。假如完结时刻不契合要求,则能够说体系产生了问题。”也便是说,不论实时运用程序进行的是何种使命,它不只需求正确进行该使命并且还有必要及时完结它。
人们很简略对实时产生误解,以为实时即速度足够快,实践上,实时并不意味着速度快。实时的要害在于确保完结时刻,而不在于原始速度,由于速度功用与硬件相关,能够经过建立快速硬件渠道(处理器、存储器子体系等)来取得所需的功用。而实时的行为是一个软件问题,其方针是让要害的操作能够在所确保的时刻之内完结。
实时进程不会影响自己在履行环境中的调度,反而是环境影响实时运用程序的调度。也便是说,实时进程一般和某个物理事情相关联,比方外围设备的中止。那么明显,影响实时的原因在于中止呼应延时,在Linux体系中可细分为中止延时、中止处理、调度延时。一般来说,针对用户对超出时刻约束所形成的影响的可接受程度,实时又可分为软实时和硬实时。
大多数人都赞同软实时意味着操作有时刻约束。假如超过了时刻约束后操作还没有完结的话,体会的质量就会下降,但不会带来丧命成果。桌面作业站便是一个需求软实时功用的绝好比方。修正文档时,你希望在按键之后立刻在屏幕上看到成果。在播映MP3文件时,你希望听到没有任何杂音、爆音或中止的高品质音乐。假如这些所谓的软实时事情错失了时限,成果或许不尽善尽美,并导致体会的质量有所下降,但这并不是灾祸性的。
硬实时的特点是错失时限会形成严峻成果。在一个硬实时体系中,假如错失了时限,成果往往是灾祸性的。当然,“灾祸”是相对而言的。但假如你的嵌入式设备正在操控喷气式飞机引擎的燃料流,而它没有能够及时呼应飞行员输入的指令或操作特性的改动,丧命成果就不行避免了。
这儿,咱们总结一下软实时和硬实时的界说。关于软实时体系,假如错失了时限,体系的核算值或成果会不太抱负。可是,关于硬实时体系,假如错失了某个时限,体系便是失利的,并且或许会形成灾祸性的成果。
尽管Linux体系功用强大、实用性强、易于软件的二次开发,并且供给编程人员了解的规范API。可是由于Linux体系一开始就被规划成GPOS(通用操作体系),它的意图是构建一个完好、安稳的开源操作体系,尽量缩短体系的均匀呼应时刻,进步吞吐量,重视操作体系的全体功用需求,到达更好地均匀功用。(在操作体系中,咱们能够把吞吐量简略的理解为在单位时刻内体系能够处理的事情总数。)
因此在规划Linux的进程调度算法时首要考虑的是公平性,也便是说,调度器尽或许将可用的资源均匀分配给一切需求处理器的进程,并确保每个进程都得以运转。但这个规划方针是和实时进程的需求各走各路的,所以规范Linux并不供给强实时性。
Linux的体系进程运转分为用户态和内核态两种方式。当进程运转在用户态时,具有高的优先级的进程能够抢占进程,能够较好地完结使命;可是当进程运转在内核态时,即便其他高优先级进程也不能抢占该进程。当进程经过体系调用进入内核态运转时,实时使命有必要等候体系调用回来后才干取得体系资源。这和实时体系所要求的高优先级使命运转是彼此对立的。
当然,这种状况在Linux2.6版别的内核发布以来有了明显改善,Linux2.6版别后的内核是抢占式的,这意味着进程不管在处于内核态仍是用户态,都或许被抢占。Linux2.6今后的内核供给以下3种抢占方式供用户挑选。
PREEMPT_NONE——没有强制性的抢占。全体的均匀延时较低,但偶然也会呈现一些较长的延时。它最适宜那些以全体吞吐率为首要规划原则的运用。PREEMPT_VOLUNTARY——下降延时的第一阶段。它会在内核代码的一些要害方位上放置额定的显现抢占点,以下降延时。但这是以献身全体吞吐率为价值的。PREEMPT/PREEMPT_DESKTOP——这种方式使内核在任何当地都是可抢占的,临界区在外。这种方式适用于那些需求软实时功用的运用程序,比方音频和多媒体。这也是以献身全体吞吐率为价值的。
Linux在进行中止处理时都会封闭中止,这样能够更快、更安全地完结自己的使命,可是在此期间,即便有更高优先级的实时进程产生中止,体系也无法呼应,有必要比及当时中止使命处理完毕。这种状况下会导致中止延时和调度延时增大,下降Linux体系的实时性。
时钟体系是核算机的重要组成部分,相当于整个操作体系的脉息。体系所能供给的最小时刻距离称为时钟粒度,时钟粒度与进程呼应的推迟性是正比联系,即粒度越粗糙,推迟性越长。但时钟粒度并不是越小越好,就平等硬件环境而言,较小的时刻粒度会导致体系开支增大,下降全体吞吐率。在Linux2.6内核中,时钟中止产生频率规模是50~1200Hz,周期不小于0.8ms,关于需求几十微秒的呼应精度的运用来说明显不满意要求。而在嵌入式Linux体系中,为了进步全体吞吐率,时钟频率一般设置为100HZ或250HZ。
Linux选用虚拟内存技能,进程能够运转在比实践空间大得多的虚拟空间中。在分时体系中,虚拟内存机制十分适用,可是关于实时体系这是难以忍受的,频频的页面换进换出会使得体系进程运转无法在规则时刻内完结。关于此问题,Linux体系供给内存锁定功用,以避免在实时处理中存储页被换出。
多个使命互斥地拜访同一共享资源时,需求避免数据遭到损坏,体系一般选用信号量机制处理互斥问题。可是,在采纳根据优先级调度的实时体系中,信号量机制简略形成优先级倒置,即低优先级使命占用高优先级使命资源,导致高优先级使命无法运转。
尽管从2.6.12版别之后,Linux内核现已能够在较快的x86处理器上完结10毫秒以内的软实时功用。但假如想完结可猜测、可重复的微秒级的延时,使Linux体系更好地运用于嵌入式实时环境,则需求在确保Linux体系功用的基础上对其进行改造。下一节将介绍经过实时补丁来进步Linux实时性的办法。
对Linux内核代码进行纤细修正并不对内核作大规模的改变,在遵从GPL协议的状况下,直接修正内核源代码将Linux改形成一个彻底可抢占的实时体系。中心修正面向部分,不会从根本上改动Linux内核,并且一些改动还能够经过Linux的模块加载来完结,即体系需求处理实时使命时加载该功用模块,不需求时动态卸载该模块。
在装备现已打过实时补丁的内核代码时,咱们发现实时补丁添加了第4种抢占方式,称为PREEMPT_RT(实时抢占)。实时补丁在Linux内核中添加了几个重要特性,包含运用可抢占的互斥量来代替自旋锁;除了运用preempt_disable()维护的区域以外,内核中的一切当地都敞开了非自愿式抢占(involuntary preemption)功用。这种方式能够明显下降颤动(延时的改动),并且使那些对延时要求很高的实时运用具有可猜测的较低延时。
这种办法存在的问题是:很难百分之百确保,在任何状况下,GPOS程序代码绝不会阻止RTOS的实时行为。也便是说,经过修正Linux内核,难以确保实时进程的履行不会遭到非实时进程所进行的不行猜测活动的搅扰。
实践上,双内核的规划缘由在于,人们不相信规范Linux内核能够在任何状况下完成它的实时许诺,由于GPOS内核自身就很杂乱,更多的程序代码一般会导致更多的不确定性,这样将无法契合可猜测性的要求。更何况Linux内核极快的开展速度,使其会在很短的时刻内带来很大的改动,直接修正Linux内核源代码的办法将难以坚持同步。
双内核法是在同一硬件渠道上选用两个彼此配合,一起作业的体系中心,经过在Linux体系的最底层添加一层实时中心来完结。其间的一个中心供给准确的实时多使命处理,另一个中心供给杂乱的非实时通用功用。
双内核办法的本质是把规范的Linux内核作为一个一般进程在另一个内核上运转。要害的改造部分是在Linux和中止操控器之间加一个中止操控的仿真层,成为其实时内核的一部分。该中止仿真机制供给了一个标志用来记载Linux的关开中止状况。一般只在修正中心数据结构要害代码时才关中止,所以其间止呼应很小。其长处是能够做到硬实时,并且能很方便地完结一种新的调度战略。
为方便运用,实时内核一般由一套可动态载入的模块供给,也能够像编译任何一般的子体系那样在Linux源码树中直接编译。常用的双内核法实时补丁有RTLinux/GPL、RTAI 和 Xenomai,其间RTLinux/GPL只允许以内核模块的方式供给实时运用;而RTAI和Xenomai支撑在具有MMU维护的用户空间中履行实时程序。下面,咱们将对RTAI与Xenomai进行剖析。
RTAI(Real-TIme Linux ApplicaTIon interface)尽管实时功用较好,但对ARM支撑不行,更新速度极慢,形成项目开发周期长,研制本钱高。与RTAI比较,Xenomai愈加专心于用户态下的实时性、供给多套与干流商业RTOS兼容的API以及对硬件的广泛支撑,在其之上构建的运用体系能坚持较高实时性,并且安稳性和兼容性更好;此外,Xenomai社区活泼,紧跟干流内核更新,支撑多种架构,对ARM的支撑很好。