IC技术讲座是本刊2005年推出的全新技术类栏目。为了让工程师在设计开发中完善和拓展基础理论与系统知识,丰富应用经验,《世界电子元器件》和中电网联合清华大学等知名院校共同创办了这个栏目,特约知名学者、教授以及著名半导体公司的应用工程师撰写,以系列讲座的方式对热点IC技术进行全面而系统的介绍,涵盖最新技术要点。最先开设的讲座将围绕三大课题:DSP、FPGA和嵌入式系统,每个课题都将连载6期。
采用嵌入式操作系统
现在许多嵌入式系统要胜任的工作越来越复杂,需要采用32位的嵌入式处理器,这样嵌入式操作系统就成为嵌入式系统设计中必不可少的一个环节。众所周知通用操作系统(如Microsoft
Windows系列的操作系统)并不适合直接应用在嵌入式操作系统上,为了适应嵌入式系统的需要,必须在整个系统的软件架构中引入嵌入式操作系统。
在嵌入式系统应用中,早期的16位及16位以下的微处理器计算能力有限,要处理的任务一般比较简单,因而程序员可以在应用程序中自己管理微处理器的工作流程,很少需要用到嵌入式操作系统。当系统变得较为复杂后,对系统中断的处理以及多个功能模块之间的协调需要由程序员自己来控制和解决,这样做的结果是,随着程序内部的逻辑关系变得越来越复杂,软件开发小组对于驾驭复杂的功能模块逐渐显得力不从心,为了保证中断相关处理的正确性和完整性,为了保证不同模块之间对硬件资源的共享和互斥,为了保证系统能定期执行各种任务,软件开发小组不得不编写和维护一个复杂的专用操作系统和应用程序的结合体,这样做使得系统的开发和维护成本加大,也不利于系统的升级。所以在逐渐变得复杂的嵌入式系统中采用成熟的嵌入式操作系统成为更好的解决方案,如嵌入式Linux、VxWorks、pSOS、WinCE、DeltaOS、uCOS、TinyOS等等。
图(略)
为了实现一个支持各种硬件体系结构、运行稳定高效的嵌入式操作系统需要付出很多的心血,嵌入式操作系统本身包含大量的代码,而且这些代码非常精巧、相应的数据结构非常复杂,即使是读懂这些代码也要花费很多时间。比如最简单的uCOS-II嵌入式操作系统的最小实现也需近千行代码,而普通的嵌入式Linux内核则有近百万行代码。在嵌入式开发中推荐采用一种通用的嵌入式操作系统,而不是自己从头编写一个专用的嵌入式操作系统,因为通用的嵌入式操作系统经过多年的发展一般来说稳定性、性能、功能等各方面都会比自己重写一个专用的操作系统要好,而且购买它们的成本也比自己从头开发要低得多;另外,通用嵌入式操作系统一般都遵循操作系统接口标准——POSIX,使用这些系统调用接口进行开发可以大大方便上层应用软件在不同嵌入式操作系统、不同操作系统版本之间的移植,系统升级换代方便、成本低、速度快。
总结来说采用嵌入式操作系统的原因是:解决多任务所带来的复杂性;提高应用程序的可移植性;降低系统开发和维护成本。
嵌入式操作系统中的关键技术
在一个完整的嵌入式系统中,嵌入式操作系统介于底层硬件和上层应用程序之间,如图1所示,它是整个系统中不可缺少的重要组成部分。 嵌入式操作系统与传统操作系统的基本功能是一致的,即:首先嵌入式操作系统必须能正确、高效地访问和管理底层的各种硬件资源,很好地处理资源管理中的冲突;其次嵌入式操作系统要能为应用程序提供功能完备、使用方便、与底层硬件细节无关的系统调用接口。
图1 嵌入式系统整体结构及嵌入式操作系统的地位(略)
但嵌入式操作系统也有其独特的需求和技术特点,主要区别是:
1)许多嵌入式系统应用有实时性要求,因此多数嵌入式操作系统都具备实时性的技术指标,能保障系统的实时响应速度;
2)为适应嵌入式系统计算资源的限制,嵌入式操作系统核心部分的体积必须尽可能的小;
3)为了适应各种应用需求的变化,嵌入式操作系统还应该具有可裁减性、可伸缩性、易移植性的特点,让开发人员可以根据需要对嵌入式操作系统进行剪裁和移植;
4)嵌入式操作系统往往是长期连续运行的,因此要求要有很高的可靠性,不能“死机”;
5)针对特定的应用需求,嵌入式操作系统往往还要对某些模块做特别的性能优化和功能增强。
实时性
许多应用场合对嵌入式系统有实时性的要求,比如汽车的安全气囊要求能在一个极短的时间内侦测到汽车碰撞事件的发生并控制打开安全气囊。为了实现上述目标,一方面硬件的传感器和安全气嚢要有足够快的响应速度,另一方面就是微处理器、嵌入式操作系统和相应的事件响应程序要能处理得足够快。
普通操作系统为了实现在多进程并发执行时进行正确的资源管理,往往会对某段代码通过关中断的方式进行保护,而且由于多个进程并发执行后情况变得异常复杂,关中断的时间可能被拖得很长且不确定,中断的关闭就会使得实时请求不能通过中断信号迅速告知CPU,因此系统可能出现的最长关中断时间决定着操作系统的实时性的指标。嵌入式操作系统为了提高实时性能,就必须尽量缩短操作系统代码中的关闭中断过程,并通过精心的设计确定关中断的时间长短。这些设计包括:
1)操作系统中的进程必须是具有严格优先级差异的,而且应该是抢占式的操作系统内核,即最高优先级的进程即使是最后出现,也应该最先获得运行,而且是无条件立即停止当前进程的运行来切换到具有最高优先级的进程。如图2所示。
图2 嵌入式操作系统中进程优先级差异(略)
2)与实时处理相关的函数应尽量都是可重入的,即函数中均使用局部变量。如果使用全局变量,为保证程序的正确性必须对全局变量的访问加锁,而这样的保护措施有可能导致进程堵塞,从而影响操作系统的实时性。
3)高效的克服优先级反转问题,防止高优先级的进程由于等待某些被低优先级进程已占用的资源,从而被其他低优先级的进程抢先运行,影响系统的实时性能。
4)其他实时操作系统内核的设计,如解决周期性任务的调度和时间抖动问题等。
在实时性方面,VxWorks、uC/OS-II、QNX、国内的DeltaOS等操作系统都具有较好的实时性能,其中VxWorks是性能稳定的商用实时操作系统,有较长的使用历史和广泛的用户群;uC/OS-II操作系统是开放源码的小型实验性操作系统,实时性很强,而且代码简单,便于分析、学习与改造,应用范围也很广;DeltaOS是国内自主研发的实时操作系统,广泛地应用于工业、军事等领域;普通的Linux操作系统在经过实时性改造后也可以具有较强的实时性而成为实时操作系统,如RTAI-Linux等。
当然,需要说明的是并不是所有的嵌入式系统都有实时性的要求,因此也并不是所有的嵌入式操作系统都必需是实时操作系统,在智能手机、PDA等嵌入式应用中就广泛地采用了嵌入式Linux、WinCE等非实时的操作系统。
小内核、可配置与易移植
嵌入式系统往往只具备较小的存储资源,而且存储器的大小往往与嵌入式系统的制造成本紧密相关,因此必须采用尽量小的操作系统基本内核,同时让其他各种非必须的部分通过开发人员需要进行配置并加入到操作系统的基本内核中,这样可以使得嵌入式操作系统内核的尺寸保持得较小。嵌入式操作系统的尺寸包括静态的尺寸(内核二进制文件占用非易失存储器的大小)和动态的尺寸(系统运行起来后占用内存的大小)。这两者都很重要,静态尺寸反映了对Flash等非易失存储器的占用情况,动态尺寸反映了对SDRAM等系统内存的消耗情况。
可配置性是嵌入式操作系统的又一个重要特征,也是区别于通用操作系统的一个重要特点。在嵌入式领域,底层硬件和应用需求往往变化多端,有的系统需要存储管理单元来在虚拟地址空间上运行程序;有的嵌入式系统希望具有优先级抢先调度机制;有的嵌入式系统希望实时时钟的周期为20ms,有的希望是1ms;有的嵌入式系统的底层硬件有多级中断,有的只有一级中断等等。所有这些变化使一个嵌入式操作系统要想占据更大的市场份额,就必须自身具备可配置性,并且配置功能方便易用,使得同一个嵌入式操作系统的代码在经过较为方便的配置后,可以在特定的硬件平台和应用需求下获得最佳的性能。eCos嵌入式操作系统是可配置性的典型代表,它在操作系统内部设计了大量可以调节操作系统特性和性能的参数,并为配置这些参数设计了专门的配置工具,该工具具有Windows和Linux等多种版本,可以在开发主机(Host机)上方便地进行配置,如图3所示。除eCos操作系统外,其他嵌入式操作系统如OSKit、Linux、VxWorks、WinCE等操作系统也具备不同程度的可配置性。
图3 eCos嵌入式操作系统参数配置界面(略)
可移植性是指同一个嵌入式操作系统在进行适当修改后可以在不同的硬件平台上成功运行。由于移植的目的是希望在不同的底层硬件平台(或者说是不同的嵌入式处理器)上运行,因此嵌入式操作系统为了获得良好的可移植性,一般都将移植时需要修改的代码集中在少数几个与硬件操作相关的C程序或汇编程序中,或者将相关代码独立成外设驱动程序,以方便系统开发人员的移植工作,比如嵌入式操作系统中提到的硬件抽象层(HAL)、板级支持包(BSP)等概念都是为加快移植工作效率而提出的;同时为方便移植,嵌入式操作系统的开发和维护团队还应该提供完整的文档来详细说明移植的过程和步骤,帮助系统设计人员完成移植工作;此外虽然嵌入式处理器多种多样,但同一系列的处理器还是非常相近的,通过提供尽可能多的已有硬件平台上的移植结果,或者由系统开发人员在Internet上搜索尽可能多的已有工作成果,也是加快移植速度、提高嵌入式操作系统可移植性的有效途径。
可靠性
任何软件都有可能存在错误,嵌入式操作系统也不例外。运行在桌面上的操作系统有时会“死机”,使用者还可以通过手工重启计算机来予以容忍,但是嵌入式系统往往要长期在无人值守的环境下运行,甚至是常年运行,因此对可靠性的要求就成为嵌入式操作系统的一个重要特点。现在已有的一些嵌入式操作系统,如嵌入式Linux、VxWorks、uC/OS等等都已经经过了多年应用的考验,也有无数的工程师对它们的代码进行了检查,一般来说这些操作系统都是较为稳定和安全的,以Linux内核为例,有研究估计570万行的Linux内核源码中约包含不到1000个程序设计错误,错误率为不到万分之二。但是没有任何方法可以证明它们是绝对安全可靠的,也许在普通应用(如手机等消费类电子产品)中这些系统还可以接受,但是在一些特殊应用场合下,如军用、医用、核电站、航空航天、工业控制、汽车制动等,系统的一个错误就可能造成很大的损失,因此针对这些领域的需求,在嵌入式系统的设计中还应该对操作系统内核的代码进行详细的检查,并进行大量的测试,保证嵌入式操作系统的可靠性。为实现这一目标,迄今为止还没有行之有效的方法,而主要依靠设计人员的丰富经验、认真仔细的作风、大量时间和人力成本的投入、广泛实际应用的检验来实现。
结语
本文探讨了嵌入式操作系统与通用的台式计算机操作系统的异同,介绍了嵌入式操作系统所具备的特点。未来随着嵌入式系统的应用需求越来越多样化、越来越复杂,嵌入式操作系统必将在上述这些特点上(如实时性、可配置性、可移植性等)越来越具有特色,分别适用于不同的嵌入式应用需求,不断加快嵌入式系统的开发周期,同时又能降低嵌入式系统的研发和生产成本。
|