如何选择一个合适的嵌入式操作系统?

2019-07-13 08:31发布

  挑选一个适宜的嵌入式操作体系,能够考虑以下几个因素:  第一是运用。假如你想开发的嵌入式设备是一个和网络运用密切相关或许就是一个网络设备,那么你应该挑选用嵌入式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操作体系  Linux体系作为一个GPOS(通用操作体系)开展至今现已十分成熟可靠了,并且由于遵从GPL协议,开放一切体系源代码,十分易于裁剪。更重要的是,与其他开源的GPOS或RTOS比较,Linux体系支撑多种处理器、开发板,供给多种软件开发工具,一起Linux体系对网络和图形界面的支撑十分出 {MOD}。明显,挑选Linux操作体系在产品的开发周期和本钱操控方面都有巨大优势。  凭借经济和技能方面的许多优势,Linux正被越来越多的嵌入式设备所运用。Linux在嵌入式体系商场的占用率越来越高,以下是大部分产品挑选Linux体系的原因:  Linux支撑的硬件设备种类繁复。  Linux支撑十分多的运用程序和网络协议。  Linux的扩展性很好,从小型的消费电子产品到大型、笨重的电信级交换机和路由器都能够选用Linux。  和传统的专有嵌入式操作体系不同,布置Linux不需求缴纳专利费。  Linux吸引了为数众多的活泼的开发者,能很快支撑新的硬件架构、渠道和设备。  越来越多的硬件和软件厂商,包含简直一切的尖端芯片制造商和独立软件开发商,现在都支撑Linux。  什么是实时?  实时体系的典型界说如下:“所谓实时体系,就是体系中核算效果的正确性不只取决于核算逻辑的正确性,还取决于发作效果的时刻。假如完结时刻不契合要求,则能够说体系发作了问题。”也就是说,不管实时运用程序进行的是何种使命,它不只需求正确进行该使命并且还有必要及时完结它。  人们很简略对实时发作误解,认为实时即速度足够快,实践上,实时并不意味着速度快。实时的要害在于确保完结时刻,而不在于原始速度,由于速度功用与硬件相关,能够经过建立快速硬件渠道(处理器、存储器子体系等)来取得所需的功用。而实时的行为是一个软件问题,其方针是让要害的操作能够在所确保的时刻之内完结。  实时进程不会影响自己在履行环境中的调度,反而是环境影响实时运用程序的调度。也就是说,实时进程一般和某个物理事情相关联,比方外围设备的中止。那么明显,影响实时的原因在于中止呼应延时,在Linux体系中可细分为中止延时、中止处理、调度延时。一般来说,针对用户对超出时刻约束所形成的影响的可接受程度,实时又可分为软实时和硬实时。  软实时  大多数人都赞同软实时意味着操作有时刻约束。假如超过了时刻约束后操作还没有完结的话,体会的质量就会下降,但不会带来丧命效果。桌面作业站就是一个需求软实时功用的绝好比方。编辑文档时,你期望在按键之后立刻在屏幕上看到效果。在播映MP3文件时,你期望听到没有任何杂音、爆音或中止的高品质音乐。假如这些所谓的软实时事情错失了时限,效果可能不尽善尽美,并导致体会的质量有所下降,但这并不是灾难性的。  硬实时  硬实时的特点是错失时限会形成严峻效果。在一个硬实时体系中,假如错失了时限,效果往往是灾难性的。当然,“灾难”是相对而言的。但假如你的嵌入式设备正在操控喷气式飞机引擎的燃料流,而它没有能够及时呼应飞行员输入的指令或操作特性的改动,丧命效果就不行防止了。  这儿,咱们总结一下软实时和硬实时的界说。关于软实时体系,假如错失了时限,体系的核算值或效果会不太抱负。但是,关于硬实时体系,假如错失了某个时限,体系就是失利的,并且可能会形成灾难性的效果。  限制规范Linux操作体系实时性的因素  尽管Linux体系功用强大、实用性强、易于软件的二次开发,并且供给编程人员了解的规范API。可是由于Linux体系一开始就被规划成GPOS(通用操作体系),它的意图是构建一个完好、安稳的开源操作体系,尽量缩短体系的均匀呼应时刻,进步吞吐量,注重操作体系的全体功用需求,到达更好地均匀功用。(在操作体系中,咱们能够把吞吐量简略的理解为在单位时刻内体系能够处理的事情总数。)  因此在规划Linux的进程调度算法时主要考虑的是公平性,也就是说,调度器尽可能将可用的资源均匀分配给一切需求处理器的进程,并确保每个进程都得以运转。但这个规划方针是和实时进程的需求背道而驰的,所以规范Linux并不供给强实时性。  Linux体系实时性不强使其在嵌入式运用中有必定的局限性,主要是受内核可抢占性、进程调度办法、中止处理机制、时钟粒度等几个方面的限制,详细如下:  (1) 进程调度  Linux体系供给契合POSIX规范的调度战略,包含FIFO调度战略(SCHED_FIFO)、带时刻片轮转的实时调度战略(SCHED_RR)和静态优先级抢占式调度战略(SCHED_OTHER)。Linux进程默许的调度战略为SCHED_OTHER,这种调度办法尽管能够让进程公平地运用CPU和其它资源,可是并不能确保对时刻要求严格或许高优先级的进程将先于低优先级的履行,这将严峻影响体系实时性。那么,将实时进程的调度战略设置为SCHED_FIFO 或SCHED_RR ,似乎使得Linux体系具有依据进程优先级进行实时调度的能力,但问题在于,Linux体系在用户态支撑可抢占调度战略,而在内核态却不彻底支撑抢占式调度战略。这样运转在Linux内核态的使命(包含体系调用和中止处理)是不能被其它优先级更高的使命所抢占的,由此引起优先级反转问题。  (2) 内核抢占机制  Linux的体系进程运转分为用户态和内核态两种方式。当进程运转在用户态时,具有高的优先级的进程能够抢占进程,能够较好地完结使命;可是当进程运转在内核态时,即便其他高优先级进程也不能抢占该进程。当进程经过体系调用进入内核态运转时,实时使命有必要等候体系调用回来后才能取得体系资源。这和实时体系所要求的高优先级使命运转是相互矛盾的。  当然,这种状况在Linux2.6版别的内核发布以来有了明显改善,Linux2.6版别后的内核是抢占式的,这意味着进程无论在处于内核态仍是用户态,都可能被抢占。Linux2.6以后的内核供给以下3种抢占方式供用户挑选。  PREEMPT_NONE——没有强制性的抢占。全体的均匀延时较低,但偶然也会出现一些较长的延时。它最合适那些以全体吞吐率为首要规划原则的运用。  PREEMPT_VOLUNTARY——下降延时的第一阶段。它会在内核代码的一些要害位置上放置额定的显现抢占点,以下降延时。但这是以献身全体吞吐率为价值的。  PREEMPT/PREEMPT_DESKTOP——这种方式使内核在任何当地都是可抢占的,临界区在外。这种方式适用于那些需求软实时功用的运用程序,比方音频和多媒体。这也是以献身全体吞吐率为价值的。  (3) 中止屏蔽  Linux在进行中止处理时都会封闭中止,这样能够更快、更安全地完结自己的使命,可是在此期间,即便有更高优先级的实时进程发作中止,体系也无法呼应,有必要比及当前中止使命处理完毕。这种状况下会导致中止延时和调度延时增大,下降Linux体系的实时性。  (4) 时钟粒度粗糙  时钟体系是核算机的重要组成部分,相当于整个操作体系的脉息。体系所能供给的最小时刻间隔称为时钟粒度,时钟粒度与进程呼应的推迟性是正比关系,即粒度越粗糙,推迟性越长。但时钟粒度并不是越小越好,就平等硬件环境而言,较小的时刻粒度会导致体系开支增大,下降全体吞吐率。在Linux2.6内核中,时钟中止发作频率规模是50~1200Hz,周期不小于0.8ms,关于需求几十微秒的呼应精度的运用来说明显不满意要求。而在嵌入式Linux体系中,为了进步全体吞吐率,时钟频率一般设置为100HZ或250HZ。  别的,体系时钟担任软守时,当软守时器逐步增多时会引起守时器冲突,添加体系负荷。  (5) 虚拟内存办理  Linux选用虚拟内存技能,进程能够运转在比实践空间大得多的虚拟空间中。在分时体系中,虚拟内存机制十分适用,但是关于实时体系这是难以忍受的,频频的页面换进换出会使得体系进程运转无法在规守时刻内完结。  关于此问题,Linux体系供给内存锁定功用,以防止在实时处理中存储页被换出。  (6) 同享资源的互斥拜访差异  多个使命互斥地拜访同一同享资源时,需求防止数据遭到损坏,体系一般选用信号量机制处理互斥问题。但是,在采纳根据优先级调度的实时体系中,信号量机制简略形成优先级倒置,即低优先级使命占用高优先级使命资源,导致高优先级使命无法运转。  尽管从2.6.12版别之后,Linux内核现已能够在较快的x86处理器上完结10毫秒以内的软实时功用。但假如想完结可猜测、可重复的微秒级的延时,使Linux体系更好地运用于嵌入式实时环境,则需求在确保Linux体系功用的基础上对其进行改造。下一节将介绍经过实时补丁来进步Linux实时性的办法。  常用的实时Linux改造方案  依据实时性体系要求以及Linux的特点和功用剖析,对规范Linux实时性的改造存在多种办法,较为合理的两大类办法为:  直接修正Linux内核源代码。  双内核法。  1 直接修正Linux内核源代码  对Linux内核代码进行纤细修正并不对内核作大规模的改变,在遵从GPL协议的状况下,直接修正内核源代码将Linux改形成一个彻底可抢占的实时体系。中心修正面向部分,不会从根本上改动Linux内核,并且一些改动还能够经过Linux的模块加载来完结,即体系需求处理实时使命时加载该功用模块,不需求时动态卸载该模块。  现在kernel.org发布的主线内核版别还不支撑硬实时。为了敞开硬实时的功用,有必要对代码打补丁。实时内核补丁是多方尽力的一起效果,意图是为了下降Linux内核的延时。这个补丁有多位代码贡献者,现在由Ingo Molnar维护,补丁网址如下:  www.kernel.org/pub/linux/kernel/projects/rt/。  在装备现已打过实时补丁的内核代码时,咱们发现实时补丁添加了第4种抢占方式,称为PREEMPT_RT(实时抢占)。实时补丁在Linux内核中添加了几个重要特性,包含运用可抢占的互斥量来代替自旋锁;除了运用preempt_disable()维护的区域以外,内核中的一切当地都敞开了非自愿式抢占(involuntary preemption)功用。这种方式能够明显下降颤动(延时的改动),并且使那些对延时要求很高的实时运用具有可猜测的较低延时。  这种办法存在的问题是:很难百分之百确保,在任何状况下,GPOS程序代码绝不会阻止RTOS的实时行为。也就是说,经过修正Linux内核,难以确保实时进程的履行不会遭到非实时进程所进行的不行猜测活动的搅扰。  2 双内核法  实践上,双内核的规划缘由在于,人们不相信规范Linux内核能够在任何状况下完成它的实时许诺,由于GPOS内核自身就很杂乱,更多的程序代码一般会导致更多的不确定性,这样将无法契合可猜测性的要求。更何况Linux内核极快的开展速度,使其会在很短的时刻内带来很大的改动,直接修正Linux内核源代码的办法将难以坚持同步。  双内核法是在同一硬件渠道上选用两个相互配合,一起作业的体系中心,经过在Linux体系的最底层添加一层实时中心来完结。其间的一个中心供给准确的实时多使命处理,另一个中心供给杂乱的非实时通用功用。  双内核办法的本质是把规范的Linux内核作为一个一般进程在另一个内核上运转。要害的改造部分是在Linux和中止操控器之间加一个中止操控的仿真层,成为其实时内核的一部分。该中止仿真机制供给了一个标志用来记录Linux的关开中止状况。一般只在修正中心数据结构要害代码时才关中止,所以其间止呼应很小。其长处是能够做到硬实时,并且能很方便地完结一种新的调度战略。  为方便运用,实时内核一般由一套可动态载入的模块供给,也能够像编译任何一般的子体系那样在Linux源码树中直接编译。常用的双内核法实时补丁有RTLinux/GPL、RTAI 和 Xenomai,其间RTLinux/GPL只允许以内核模块的方式供给实时运用;而RTAI和Xenomai支撑在具有MMU维护的用户空间中履行实时程序。下面,咱们将对RTAI与Xenomai进行剖析。
  图1. RTAI(左)和Xenomai(右)实时内核在Linux中的分层结构  图1所示为RTAI和Xenomai两个实时内核别离与规范Linux内核组成双内核体系是的分层结构。能够看到两者有略微不同的组织方式,与Xenomai让ADEOS掌控一切的中止源不同的是,RTAI拦截它们,运用ADEOS将那些RTAI不感兴趣的中止告诉送给Linux(也就是,中止不影响实时时序)。这样混合过程的意图是进步功用,由于在这种状况下,假如中止是要唤醒一个实时使命,就防止了由ADEOS办理中止的开支。从这儿能够看出,RTAI的实时功用应该是比Xenomai要好的。  RTAI(Real-Time Linux Application interface)尽管实时功用较好,但对ARM支撑不行,更新速度极慢,形成项目开发周期长,研制本钱高。  与RTAI比较,Xenomai更加专心于用户态下的实时性、供给多套与干流商业RTOS兼容的API以及对硬件的广泛支撑,在其之上构建的运用体系能坚持较高实时性,并且安稳性和兼容性更好;此外,Xenomai社区活泼,紧跟干流内核更新,支撑多种架构,对ARM的支撑很好。  Xenomai是Linux内核的一个实时开发结构。它期望无缝地集成到Linux环境中来给用户空间运用程序供给全面的、与接口无关的硬实时功用。Xenomai是根据一个笼统实时操作体系中心的,能够被用来在一个通用实时操作体系调用的中心上,构建任意多个不同的实时接口。Xenomai项目始于2001年8月。2003年它和RTAI项目兼并推出了RTAI/fusion。2005年,由于开发理念不同,RTAI/fusion项目又从RTAI中独立出来作为Xenomai项目。比较之下,RTAI项目致力于技能上可行的最低推迟;Xenomai除此之外还很侧重扩展性、可移植性以及可维护性。Xenomai项目将对Ingo Molnar的PREEMPT_PT实时抢占补丁供给支撑,这又是与RTAI项意图一个明显的不同。RTAI和Xenomai都有开发者社区支撑,都能够作为一个VxWorks的开源代替。  Xenomai是根据Adeos(Adaptive Domain Environment for Operating System)完结的,Adeos的方针是为操作体系供给了一个灵敏的、可扩展的自适应环境;在这个环境下,多个相同或不同的操作体系能够共存,同享硬件资源。根据Adeos的体系中,每个操作体系都在独立的域内运转,每个域能够有独立的地址空间和类似于进程、虚拟内存等的软件笼统层,并且这些资源也能够由不同的域同享。与以往传统的操作体系共存办法不同,Adeos是在已有的操作体系下刺进一个软件层,经过向上层多个操作体系供给某些原语和机制完结硬件同享。运用上主要是供给了一个用于“硬件-内核”接口的纳内核(超微内核),使根据Linux环境的体系能满意硬实时的要求。  Xenomai正是充分利用了Adeos技能,它的首要方针是协助人们尽量陡峭地移植那些依赖传统RTOS的运用程序到GNU/Linux环境,防止悉数重写运用程序。它供给一个模仿器模仿传统实时操作体系的API,这样就很简略移植运用程序到GNU/Linux环境中,一起又能坚持很好的实时性。Xenomai的中心技能就是运用一个实时微内核来构建这些实时API,也称作“Skin”。Xenomai经过这种接口变种技能完结了针对多种传统RTOS的运用编程接口,方便传统RTOS运用程序向GNU/Linux的移植。图2描绘了Xenomai的这种带Skin的分层架构。
  图2. 带Skin接口的Xenomai分层结构  从图2能够看出,Xenomai体系包含多个笼统层:Adeos纳内核直接作业在硬件之上;坐落Adeos之上的是与处理器体系结构相关的硬件笼统层(Hardware Abstraction Layer, HAL);体系的中心部分是运转在硬件笼统层之上的笼统的实时内核,实时内核完结了一系列通用RTOS的根本效劳。这些根本效劳能够由Xenomai的本地API(Native)或由建立在实时内核上的针对其他传统RTOS的客户API供给,如RTAI、POSIX、VxWorks、uITRON、pSOS+等。客户API旨在兼容其所支撑的传统RTOS的运用程序在Xenomai上的移植,使运用程序在向Xenomai/Linux体系移植的过程中不需求彻底从头改写,此特性确保了Xenomai体系的稳健性。Xenomai/Linux体系为用户程序供给了用户空间和内核空间两种方式,前者经过体系调用接口完结,后者经过实时内核完结。用户空间的履行方式确保了体系的可靠性和杰出的软实时性,内核空间程序则能供给优异的硬实时性。郑州割包皮医院哪家好:http://www.zzchanghong110.com/郑州同济医院割包皮:http://www.zzchanghong110.com/郑州割包皮好医院:http://www.zzchanghong110.com/郑州哪家男科医院好:http://www.zzchanghong110.com/郑州检查男科疾病去哪家医院:http://www.zzchanghong110.com/郑州做包皮手术哪家医院便宜:http://www.zzchanghong110.com/郑州专业男科医院:http://www.zzchanghong110.com/郑州割包皮医院:https://yyk.familydoctor.com.cn/12248/