一、问题的提出
按照嵌入式系统的工程设计方法,嵌入式系统的设计可以粗略的分成三个阶段,即:分析,设计,实现。分析阶段的主要任务是确定要解决的问题及需要完成的目标。因此,分析阶段也常常被称为“需求阶段”,或“系统需求阶段”。设计阶段主要任务是解决如何在给定的约束条件下完成用户的要求。此阶段是在分析阶段的基础上研究“如何做”。实现阶段主要是解决如何在所选择的硬件和软件的基础上进行整个软、硬件系统的协调实现。按照这种设计思想,在分析阶段阶段结束后,通常开发者面临的一个棘手的问题就是硬件和软件的选择,因为它的好坏直接影响着实现阶段的任务完成。通常硬件和软件的选择有:
1.处理器
2.硬件部件
3.操作系统
4.编程语言
5.软件开发工具
6.硬件调试工具
7.软件组件
在上述选择中,通常,处理器是最重要的,同时操作系统或编程语言也是非常关键的。而且有时处理器的选择会限制操作系统的选择,操作系统的选择又会限制开发工具的选择。因此本文就如何在嵌入式系统设计中选择硬件和软件进行了一些评判因素的分析。
二、硬件的选择
(一)嵌入式处理器的选择
嵌入式系统的核心部件是各种类型的嵌入式处理器,目前据不完全统计,全世界嵌入式处理器的品种总量已经超过1000多种,流行体系结构有30几个系列。但与全球PC市场不同的是没有一种微处理器和微处理器公司可以主导嵌入式系统,仅以32位的CPU而言,就有100种以上嵌入式微处理器。由于嵌入式系统设计的差异性极大,因此选择是多样化的。设计者在选择处理器时要考虑的主要因素有:
1.调查上市的CPU供应商。有些公司如Motorola、 Intel、AMD很有名气,而有一些小的公司如QED(Santa Clara .CA)虽然名气很小,但也生产很优秀的微处理器。另外,有一些公司,如ARM、MIPS等,只设计但并不生产CPU,他们把生产权授予世界各地的半导体制造商。ARM是另外一种近年来在嵌入式系统有影响力的微处理器制造商,ARM的设计非常适合于小的电源供电系统。Apple在Newton手持计算机中使用ARM,另外有几款数字无线电话也在使用ARM。
2.处理器的处理速度。一个处理器的性能取决于多个方面的因素:时钟频率,内部寄存器的大小,指令是否对等处理所有的寄存器等。对于许多需用处理器的嵌入式系统设计来说,目标不是在于挑选速度最快的处理器,而是在于选取能够完成作业的处理器和I/O子系统。如果你的设计是面向高性能的应用,那么建议你考虑某些新的处理器,其价格极为低 廉,如IBM和Motorola 的Power PC。以前Intel 的 i960是销售极好的RISC高性能芯片,但 是最近几年却遇到强劲的对手,让位于MIPS、SH以及后起之星ARM。
3.技术指标。当前,许多嵌入式处理器都集成了外围设备的功能,从而减少了芯片的数量,进而降低了整个系统的开发费用。开发人员首先考虑的是,系统所要求的一些硬件能否无需过多的胶合逻辑(GL)就可以连接到处理器上。其次是考虑该处理器的一些支持芯片,如DMA控制器,内存管理器,中断控制器,串行设备、时钟等的配套。值得注意的是,AMD公司最近发布了一种Am186CC的通信用处理器,内置采用国人熟悉的X86内核和四路 HDLC和一个USB外围控制器。,该处理器适合于多种通信应用领域,包括:ISDN终端适配器、低端路由器、数字专线(xDSL)MODEM、USB外围设备、PBX应用、数字电话、数字环路载波以及电话系统。
4.处理器的低工耗。嵌入式微处理器最大并且增长最快的市场是手持设备、电子记事本、PDA、手机、GPS导航器、智能家电等消费类电子产品,这些产品中选购的微处理器典型的特点是要求高性能、低工耗。许多CPU生产厂家已经进入了这个领域。今天,用户可以买到一颗嵌入式的微处理器 ,其速度像笔记本中的 Pentium一样快,而它仅使用普通电池供电,并且价格不足50美元。 典型的例子有NEC、日立为HPC、Palm PC而设计的VR4111和SH7707。Digital的 Strong ARM 1100,在一个极小的200MHz主频封装中集成了彩色LCD控制器、PCMCIA触屏接 口等6个接口(含USB、IRDA),而批量的价格也在40美元以内。
5.处理器的软件支持工具。仅有一个处理器,没有较好的软件开发工具的支持,也是不行的,因此选择合适的软件开发工具对系统的实现会起到很好的作用。
6.处理器是否内置调试工具。处理器如果内置调试工具可以大大大的缩小调试周期,降低调试的难度。
7.处理器供应商是否提供评估板。许多处理器供应商可以提供评估板来验证你的理论是否正确,验证你的决策是否得当。
(二)硬件平台的选择
1.规模。打算做一套?多套?还是规模生产?如果你的规模比较大,这时可以自己设计和制备硬件,这样可以降低成本。反之,最好从第三方购买主板和I/O板卡。
2.目标市场的机会。如果想使产品尽快发售,以获得竞争力,此时要尽可能买成熟的硬件,反之,可以自己设计硬件,降低成本。
3.软件对硬件的依赖性。是否软件可以在硬件没有到位的时候先行开发。
三、软件的选择
(一)操作系统的选择
尽管嵌入式系统有着无比广阔的市场需求和发展前景,但嵌入式系统的发展多年来却经历了一个曲折和痛苦的历程。随着微处理器的产生,价格低廉、结构小巧的CPU和外设连接提供了稳定可靠的硬件架构,那么限制嵌入式系统发展的瓶颈就突出表现在了软件方面。从八十年代末开始,陆续出现了一些嵌入式操作系统,比较著名的有Tornado/VxWorkx、pSOSystem、Neculeus和Windowss CE、QNX、VRTX,以及沸沸扬扬的“女娲计划”,中国人自己的嵌入式操作系统HOPEN和现在谈论最多的嵌入式Linux操作系统等等。可用于嵌入式系统软件开发的操作系统很多,但关键是如何选择一个适合你所开发项目的操作系统,我们认为应该从以下几点进行考虑:
1.操作系统提供那些开发工具。有些实时操作系统(RTOS)只支持该系统拱应商的开发工具。也就是说,还必须向操作系统供应商获取编译器、调试器等。而有些操作系统使用广泛且有第三方工具可用,因此,选择的余地比较大。如PSOSystem支持的工具有:pRISM+,全集成开发环境,含源代码调试器(SpOTLIGHT),C/C++ 编译器(e g Diab),汇编器,连接器,C/C++ 开发环境(SNiFF+),嵌入式系统监视工具(Esp),CORBA等。而Tornado/VxWorkx支持的工具有:远程源级调试器;浏览器;WindSh 命令行接口;模块载入器;目标工具;WindConfig 板基支持包配置;大约90个第三方嵌入式开发工具和扩展。
2.操作系统向硬件接口移植的难度。操作系统到硬件的移植是一个重要的问题。它是关系到整个系统能否按期完工的一个关键因素。因此我们要选择那些可移植性程度高的操作系统。从而避免操作系统难以向硬件移植而带来的种种困难,加速系统的开发进度。
3.操作系统的内存要求。均衡考虑是否需要额外花钱去购买RAM或EEPROM来迎合操作系统对内存的较大要求。有些操作系统对内存的要求是target dependent。如Tornado/VxWorkx,开发人员能按照应用需求分配所需的资源,而不是为操作系统分配资源。从需要几K字节存储区的嵌入设计到需求更多的操作系统功能的复杂的高端实时应用, 开发人员可任意选择多达80种不同的配置。
4.开发人员是否熟悉此操作系统及其提供的API。
5.操作系统是否有提供硬件的驱动程序,如网卡等。
6.操作系统是否具有可剪裁性,即能否根据实际需要进行系统功能的剪裁。有些操作系统具有较强的可剪裁性,如嵌入式Linux、Tornado/VxWorks等等。
7.操作系统的实时性。实时性分为:软实时和硬实时。有些嵌入式操作系统只能提供软实时,如WindowsCE。作为微软大名鼎鼎的“维那斯”,Microsoft Windows CE 2.0 是32位,,Windows兼容,小内核,可伸缩实时操作系统,满足大部分嵌入式和非嵌入式应用的需要。但不够实时,属于软实时嵌入式操作系统。
(二)编程语言的选择
1.通用性。随着微处理器技术的不断发展,其功能越来越具体,种类越来越多,但不同种类的微处理器都有自己专用的汇编语言。这就为系统开发者设置了一个巨大的障碍,使得系统编程更加困难,软件重用无法实现,而高级语言一般和具体机器的硬件结构联系较少,比较流行的高级语言对多数微处理器都有良好的支持,通用性较好
2.可移植性程度。由于汇编语言和具体的微处理器密切相关,为某个微处理器设计的程序不能直接移植到另一个不同种类的微处理器上使用,因此,移植性差;而高级语言对所有微处理器都是通用的,因此,程序可以在不同的微处理器上运行,可移植性较好。这是实现软件重用的基础。
3.执行效率。一般来说,越是高级的语言,其编译器和开销就越大,应用程序也就越大、越慢。但单纯依靠低级语言,如汇编语言来进行应用程序的开发,带来的问题是编程复杂、开发周期长。因此存在一个开发时间和运行性能间的权衡。
4.可维护性。低级语言如汇编语言,可维护性不高。高级语言程序往往是模块化设计,各个模块之间的接口是固定的。因此,当系统出现问题时,可以很快地将问题定位到某个模块内,并尽快得到解决。另外,模块化设计也便于系统功能的扩充和升级。
5.基本性能。在嵌入式系统开发过程中使用的语言种类很多,比较广泛应用的高级语言有:Ada、C/C++、Modula-2和JAVA等。Ada语言定义严格,易读易懂,有较丰富的库程序支持,目前在国防、航空、航天等相关领域应用比较广泛,未来仍将在这些领域占有重要地位。C语言具有广泛的库程序支持,目前在嵌入式系统中是应用最广泛的编程语言,在将来很长一段时间内仍将在嵌入式系统应用领域占重要地位。C++是一种面向对象的编程语言,目前在嵌入式系统设计也得到了广泛的应用,如GNU C++。Visual C++,是一种集成开发环境,支持可视化编程,广泛应用于GUI程序开发。但C与C++相比,C++的目标代码往往比较庞大和复杂,在嵌入式系统应用中应充分考虑这一因素。Modula-2定义清晰,支持丰富,具有较好的模块化结构,在教学科研方面有较广泛的应用。虽然该语言的开发应用一直比较平缓,但近两年在欧洲有所复苏。Java语言相对年轻,但有很强的跨平台特性,目前发展势头较为强劲。它的"一次编程,到处可用"的特性使得它在很多领域倍受欢迎。随着网络技术和嵌入式技术的不断发展,Java及嵌入式Java的应用也将越来越广泛[2]。
(三)开发工具的选择
1.系统调试器的功能。系统调试特别是远程调试是一个重要的功能。
2.支持库函数。许多开发系统提供大量使用的库函数和模板代码。如大家比较熟悉的C++编译器就带有标准的模板库,它提供了一套用于定义各种有用的集装、存储、搜寻、排序对象。
3.编译器开发商是否持续升级编译器。
4.连接程序是否支持所有的文件格式和符号格式。
(四)硬件调试工具的选择
好的软件调试程序可以有效的发现大多数的错误。但是如果再选择一个好的硬件调试就会达到事半功倍的效果。常用的硬件调试工具有以下几种。
1.实时在线仿真器(ICE)。用户从仿真插头向ICE看,ICE应是一个可被控制的MCU。ICE是通过一根短电缆连接到目标系统上的,该电缆的一端有一个插件,插到处理器的插座上,而处理器则插到这个插件上。ICE支持常规的调试操作,如单步运行、断点、反汇编、内存检查、源程序级的调试等等。
2.逻辑分析仪。逻辑分析仪最常用于硬件调试,但也可用于软件调试。它是一种无源器件,主要用于监视系统总线的事件.