转载:http://www.ibm.com/developerworks/cn/linux/l-embed/part1/index.htmlhtml
随着信息化技术的发展和数字化产品的普及,以计算机技术、芯片技术和软件技术为核心的嵌入式系统再度成为当前研究和应用的热点,通讯、计算机、消费电子技术(3C)合一的趋势正在逐步造成,无所不在的网络和无所不在的计算(everything connecting, everywhere computing)正在将人类带入一个崭新的信息社会。linux
0 评论:git
肖文鹏 (xiaowp@263.net), 硕士研究生, 北京理工大学计算机系程序员
2003 年 9 月 01 日算法
嵌入式系统是以应用为中心,以计算机技术为基础,而且软硬件是可裁剪的,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。嵌入式系统最典型的特色是与人们的平常生活紧密相关,任何一个普通人均可能拥有各种形形色色运用了嵌入式技术的电子产品,小到MP三、PDA等微型数字化设备,大到信息家电、智能电器、车载GIS,各类新型嵌入式设备在数量上已经远远超过了通用计算机。这也难怪美国著名将来学家尼葛洛庞帝在1999年1月访华时就预言,4~5年后嵌入式智能工具将成为继PC机和Internet以后计算机工业最伟大的发明。数据库
1.1 历史与现状编程
虽然嵌入式系统是近几年才开始真正风靡起来的,但事实上嵌入式这个概念却很早就已经存在了,从上个世纪70年代单片机的出现到今天各类嵌入式微处理器、微控制器的普遍应用,嵌入式系统少说也有了近30年的历史。纵观嵌入式系统的发展历程,大体经历了如下四个阶段:安全
无操做系统阶段性能优化
嵌入式系统最初的应用是基于单片机的,大多以可编程控制器的形式出现,具备监测、伺服、设备指示等功能,一般应用于各种工业控制和飞机、导弹等武器装备中,通常没有操做系统的支持,只能经过汇编语言对系统进行直接控制,运行结束后再清除内存。这些装置虽然已经初步具有了嵌入式的应用特色,但仅仅只是使用8位的CPU芯片来执行一些单线程的程序,所以严格地说还谈不上"系统"的概念。服务器
这一阶段嵌入式系统的主要特色是:系统结构和功能相对单一,处理效率较低,存储容量较小,几乎没有用户接口。因为这种嵌入式系统使用简便、价格低廉,于是曾经在工业控制领域中获得了很是普遍的应用,但却没法知足现今对执行效率、存储容量都有较高要求的信息家电等场合的须要。
简单操做系统阶段
20 世纪80年代,随着微电子工艺水平的提升,IC制造商开始把嵌入式应用中所须要的微处理器、I/O接口、串行接口以及RAM、ROM等部件通通集成到一片 VLSI中,制造出面向I/O设计的微控制器,并一举成为嵌入式系统领域中异军突起的新秀。与此同时,嵌入式系统的程序员也开始基于一些简单的"操做系统"开发嵌入式应用软件,大大缩短了开发周期、提升了开发效率。
这一阶段嵌入式系统的主要特色是:出现了大量高可靠、低功耗的嵌入式 CPU(如Power PC等),各类简单的嵌入式操做系统开始出现并获得迅速发展。此时的嵌入式操做系统虽然还比较简单,但已经初步具备了必定的兼容性和扩展性,内核精巧且效率高,主要用来控制系统负载以及监控应用程序的运行。
实时操做系统阶段
20 世纪90年代,在分布控制、柔性制造、数字化通讯和信息家电等巨大需求的牵引下,嵌入式系统进一步飞速发展,而面向实时信号处理算法的DSP产品则向着高速度、高精度、低功耗的方向发展。随着硬件实时性要求的提升,嵌入式系统的软件规模也不断扩大,逐渐造成了实时多任务操做系统(RTOS),并开始成为嵌入式系统的主流。
这一阶段嵌入式系统的主要特色是:操做系统的实时性获得了很大改善,已经可以运行在各类不一样类型的微处理器上,具备高度的模块化和扩展性。此时的嵌入式操做系统已经具有了文件和目录管理、设备管理、多任务、网络、图形用户界面(GUI)等功能,并提供了大量的应用程序接口(API),从而使得应用软件的开发变得更加简单。
面向Internet阶段
21 世纪无疑将是一个网络的时代,将嵌入式系统应用到各类网络环境中去的呼声天然也愈来愈高。目前大多数嵌入式系统还孤立于Internet以外,随着 Internet的进一步发展,以及Internet技术与信息家电、工业控制技术等的结合日益紧密,嵌入式设备与Internet的结合才是嵌入式技术的真正将来。
信息时代和数字时代的到来,为嵌入式系统的发展带来了巨大的机遇,同时也对嵌入式系统厂商提出了新的挑战。目前,嵌入式技术与Internet技术的结合正在推进着嵌入式技术的飞速发展,嵌入式系统的研究和应用产生了以下新的显著变化:
1.2 体系结构
根据国际电气和电子工程师协会(IEEE)的定义,嵌入式系统是"控制、监视或者辅助设备、机器和车间运行的装置"(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。通常而言,整个嵌入式系统的体系结构能够分红四个部分:嵌入式处理器、嵌入式外围设备、嵌入式操做系统和嵌入式应用软件,如图1所示。
嵌入式处理器
嵌入式系统的核心是各类类型的嵌入式处理器,嵌入式处理器与通用处理器最大的不一样点在于,嵌入式CPU大多工做在为特定用户群所专门设计的系统中,它将通用 CPU中许多由板卡完成的任务集成到芯片内部,从而有利于嵌入式系统在设计时趋于小型化,同时还具备很高的效率和可靠性。
嵌入式处理器的体系结构经历了从CISC(复杂指令集)至RISC(精简指令集)和Compact RISC的转变,位数则由4位、8位、16位、32位逐步发展到64位。目前经常使用的嵌入式处理器可分为低端的嵌入式微控制器(Micro Controller Unit,MCU)、中高端的嵌入式微处理器(Embedded Micro Processor Unit,EMPU)、用于计算机通讯领域的嵌入式DSP处理器(Embedded Digital Signal Processor,EDSP)和高度集成的嵌入式片上系统(System On Chip,SOC)。
目前几乎每一个半导体制造商都生产嵌入式处理器,而且愈来愈多的公司开始拥有自主的处理器设计部门,据不彻底统计,全世界嵌入式处理器已经超过1000多种,流行的体系结构有30多个系列,其中以ARM、PowerPC、MC 68000、MIPS等使用得最为普遍。
嵌入式外围设备
在嵌入系统硬件系统中,除了中心控制部件(MCU、DSP、EMPU、SOC)之外,用于完成存储、通讯、调试、显示等辅助功能的其余部件,事实上均可以算做嵌入式外围设备。目前经常使用的嵌入式外围设备按功能能够分为存储设备、通讯设备和显示设备三类。
存储设备主要用于各种数据的存储,经常使用的有静态易失型存储器(RAM、SRAM)、动态存储器(DRAM)和非易失型存储器(ROM、EPROM、 EEPROM、FLASH)三种,其中FLASH凭借其可擦写次数多、存储速度快、存储容量大、价格便宜等优势,在嵌入式领域内获得了普遍应用。
目前存在的绝大多数通讯设备均可以直接在嵌入式系统中应用,包括RS-232接口(串行通讯接口)、SPI(串行外围设备接口)、IrDA(红外线接口)、I2C(现场总线)、USB(通用串行总线接口)、Ethernet(以太网接口)等。
因为嵌入式应用场合的特殊性,一般使用的是阴极射线管(CRT)、液晶显示器(LCD)和触摸板(Touch Panel)等外围显示设备。
嵌入式操做系统
为了使嵌入式系统的开发更加方便和快捷,须要有专门负责管理存储器分配、中断处理、任务调度等功能的软件模块,这就是嵌入式操做系统。嵌入式操做系统是用来支持嵌入式应用的系统软件,是嵌入式系统极为重要的组成部分,一般包括与硬件相关的底层驱动程序、系统内核、设备驱动接口、通讯协议、图形用户界面(GUI)等。嵌入式操做系统具备通用操做系统的基本特色,如可以有效管理复杂的系统资源,可以对硬件进行抽象,可以提供库函数、驱动程序、开发工具集等。但与通用操做系统相比较,嵌入式操做系统在系统实时性、硬件依赖性、软件固化性以及应用专用性等方面,具备更加鲜明的特色。
嵌入式操做系统根据应用场合能够分为两大类:一类是面向消费电子产品的非实时系统,这类设备包括我的数字助理(PDA)、移动电话、机顶盒(STB)等;另外一类则是面向控制、通讯、医疗等领域的实时操做系统,如WindRiver公司的VxWorks、QNX系统软件公司的QNX等。实时系统(Real Time System)是一种可以在指定或者肯定时间内完成系统功能,而且对外部和内部事件在同步或者异步时间内能作出及时响应的系统。在实时系统中,操做的正确性不只依赖于逻辑设计的正确程度,并且与这些操做进行的时间有关,也就是说,实时系统对逻辑和时序的要求很是严格,若是逻辑和时序控制出现误差将会产生严重后果。
实时系统主要经过三个性能指标来衡量系统的实时性,即响应时间(Response Time)、生存时间(Survival Time)和吞吐量(Throughput):
实时系统根据响应时间能够分为弱实时系统、通常实时系统和强实时系统三种。弱实时系统在设计时的宗旨是使各个任务运行得越快越好,但没有严格限定某一任务必须在多长时间内完成,弱实时系统更多关注的是程序运行结果的正确与否,以及系统安全性能等其余方面,对任务执行时间的要求相对来说较为宽松,通常响应时间能够是数十秒或者更长。通常实时系统是弱实时系统和强实时系统的一种折衷,它的响应时间能够在秒的数量级上,普遍应用于消费电子设备中。强实时系统则要求各个任务不只要保证执行过程和结果的正确性,同时还要保证在限定的时间内完成任务,响应时间一般要求在毫秒甚至微秒的数量级上,这对涉及到医疗、安全、军事的软硬件系统来讲是相当重要的。
时限(deadline)是实时系统中的一个重要概念,指的是对任务截止时间的要求,根据时限对系统性能的影响程度,实时系统又能够分为软实时系统(soft real-time-system)和硬实时系统(hard real-time-system)。软实时指的是虽然对系统响应时间有所限定,但若是系统响应时间不能知足要求,并不会致使系统产生致命的错误或者崩溃;硬实时则指的是对系统响应时间有严格的限定,若是系统响应时间不能知足要求,就会引发系统产生致命的错误或者崩溃。若是一个任务在时限到达之时还没有完成,对软实时系统来讲仍是能够容忍的,最多只会下降系统性能,但对硬实时系统来讲则是没法接受的,由于这样带来的后果根本没法预测,甚至多是灾难性的。在目前实际运用的实时系统中,一般容许软硬两种实时性同时存在,其中一些事件没有时限要求,另一些事件的时限要求是软实时的,而对系统产生关键影响的那些事件的时限要求则是硬实时的。
嵌入式应用软件
嵌入式应用软件是针对特定应用领域,基于某一固定的硬件平台,用来达到用户预期目标的计算机软件,因为用户任务可能有时间和精度上的要求,所以有些嵌入式应用软件须要特定嵌入式操做系统的支持。嵌入式应用软件和普通应用软件有必定的区别,它不只要求其准确性、安全性和稳定性等方面可以知足实际应用的须要,并且还要尽量地进行优化,以减小对系统资源的消耗,下降硬件成本。
1.3 关键问题
嵌入式系统是将先进的计算机技术、半导体技术以及电子技术与特定行业的具体应用相结合的产物,所以必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统,嵌入式系统的开发充满了竞争、机遇与创新,须要解决好以下一些关键问题:
Linux 从1991年问世到如今,短短的十几年时间已经发展成为功能强大、设计完善的操做系统之一,不只能够与各类传统的商业操做系统分庭抗争,在新兴的嵌入式操做系统领域内也得到了飞速发展。嵌入式Linux(Embedded Linux)是指对标准Linux通过小型化裁剪处理以后,可以固化在容量只有几K或者几M字节的存储器芯片或者单片机中,适合于特定嵌入式应用场合的专用Linux操做系统。
2.1 优点
嵌入式Linux的开发和研究是操做系统领域中的一个热点,目前已经开发成功的嵌入式系统中,大约有一半使用的是Linux。Linux之因此能在嵌入式系统市场上取得如此辉煌的成果,与其自身的优良特性是分不开的。
普遍的硬件支持
Linux 可以支持x8六、ARM、MIPS、ALPHA、PowerPC等多种体系结构,目前已经成功移植到数十种硬件平台,几乎可以运行在全部流行的CPU上。 Linux有着异常丰富的驱动程序资源,支持各类主流硬件设备和最新硬件技术,甚至能够在没有存储管理单元(MMU)的处理器上运行,这些都进一步促进了 Linux在嵌入式系统中的应用。
内核高效稳定
Linux内核的高效和稳定已经在各个领域内获得了大量事实的验证,Linux的内核设计很是精巧,分红进程调度、内存管理、进程间通讯、虚拟文件系统和网络接口五大部分,其独特的模块机制能够根据用户的须要,实时地将某些模块插入到内核或从内核中移走。这些特性使得Linux系统内核能够裁剪得很是小巧,很适合于嵌入式系统的须要。
开放源码,软件丰富
Linux是开放源代码的自由操做系统,它为用户提供了最大限度的自由度,因为嵌入式系统千差万别,每每须要针对具体的应用进行修改和优化,于是得到源代码就变得相当重要了。Linux的软件资源十分丰富,每一种通用程序在Linux上几乎均可以找到,而且数量还在不断增长。在Linux上开发嵌入式应用软件通常不用从头作起,而是能够选择一个相似的自由软件作为原型,在其上进行二次开发。
优秀的开发工具
开发嵌入式系统的关键是须要有一套完善的开发和调试工具。传统的嵌入式开发调试工具是在线仿真器(In-Circuit Emulator,ICE),它经过取代目标板的微处理器,给目标程序提供一个完整的仿真环境,从而使开发者可以很是清楚地了解到程序在目标板上的工做状态,便于监视和调试程序。在线仿真器的价格很是昂贵,并且只适合作很是底层的调试,若是使用的是嵌入式Linux,一旦软硬件可以支持正常的串口功能时,即便不用在线仿真器也能够很好地进行开发和调试工做,从而节省了一笔不小的开发费用。嵌入式Linux为开发者提供了一套完整的工具链(Tool Chain),它利用GNU的gcc作编译器,用gdb、kgdb、xgdb作调试工具,可以很方便地实现从操做系统到应用软件各个级别的调试。
完善的网络通讯和文件管理机制
Linux至诞生之日起就与Internet密不可分,支持全部标准的Internet网络协议,而且很容易移植到嵌入式系统当中。此外,Linux还支持ext二、fat1六、fat3二、romfs等文件系统,这些都为开发嵌入式系统应用打下了很好的基础。
2.2 挑战
目前,嵌入式Linux系统的研发热潮正在蓬勃兴起,而且占据了很大的市场份额,除了一些传统的Linux公司(如RedHat、MontaVista等)正在从事嵌入式Linux的开发和应用以外,IBM、Intel、Motorola等著名企业也开始进行嵌入式Linux的研究。虽然前景一片灿烂,但就目前而言,嵌入式Linux的研究成果与市场的真正要求仍有一段差距,要开发出真正成熟的嵌入式Linux系统,还须要从如下几个方面作出努力。
提升系统实时性
Linux 虽然已经被成功地应用到了PDA、移动电话、车载电视、机顶盒、网络微波炉等各类嵌入式设备上,但在医疗、航空、交通、工业控制等对实时性要求很是严格的场合中还没法直接应用,缘由在于现有的Linux是一个通用的操做系统,虽然它也采用了许多技术来加快系统的运行和响应速度,而且符合POSIX 1003.1b标准,但从本质上来讲并非一个嵌入式实时操做系统。Linux的内核调度策略基本上是沿用UNIX系统的,将它直接应用于嵌入式实时环境会有许多缺陷,如在运行内核线程时中断被关闭,分时调度策略存在时间上的不肯定性,以及缺少高精度的计时器等等。正因如此,利用Linux做为底层操做系统,在其上进行实时化改造,从而构建出一个具备实时处理能力的嵌入式系统,是如今日益流行的解决方案。
改善内核结构
Linux 内核采用的是总体式结构(Monolithic),整个内核是一个单独的、很是大的程序,这样虽然可以使系统的各个部分直接沟通,有效地缩短任务之间的切换时间,提升系统响应速度,但与嵌入式系统存储容量小、资源有限的特色不相符合。嵌入式系统常常采用的是另外一种称为微内核(Microkernel)的体系结构,即内核自己只提供一些最基本的操做系统功能,如任务调度、内存管理、中断处理等,而相似于文件系统和网络协议等附加功能则运行在用户空间中,而且能够根据实际须要进行取舍。Microkernel的执行效率虽然比不上Monolithic,但却大大减少了内核的体积,便于维护和移植,更能知足嵌入式系统的要求。能够考虑将Linux内核部分改形成Microkernel,使Linux在具备很高性能的同时,又能知足嵌入式系统体积小的要求。
完善集成开发平台
引入嵌入式Linux系统集成开发平台,是嵌入式Linux进一步发展和应用的内在要求。传统上的嵌入式系统都是面向具体应用场合的,软件和硬件之间必须紧密配合,但随着嵌入式系统规模的不断扩大和应用领域的不断扩展,嵌入式操做系统的出现就成了一种必然,由于只有这样才能促成嵌入式系统朝层次化和模块化的方向发展。很显然,嵌入式集成开发平台也是符合上述发展趋势的,一个优秀的嵌入式集成开发环境可以提供比较完备的仿真功能,能够实现嵌入式应用软件和嵌入式硬件的同步开发,从而摆脱了"嵌入式应用软件的开发依赖于嵌入式硬件的开发,而且以嵌入式硬件的开发为前提"的不利局面。一个完整的嵌入式集成开发平台一般包括编译器、链接器、调试器、跟踪器、优化器和集成用户界面,目前Linux在基于图形界面的特定系统定制平台的研究上,与Windows CE等商业嵌入式操做系统相比还有很大差距,总体集成开发环境有待提升和完善。
嵌入式系统是一种根据特定用途所专门开发的系统,它只完成预期要完成的功能,所以其开发过程和开发环境同传统的软件开发相比有着显著的不一样。
3.1 开发流程
在嵌入式系统的应用开发中,整个系统的开发过程如图2所示:
嵌入式系统发展到今天,对应于各类微处理器的硬件平台通常都是通用的、固定的、成熟的,这就大大减小了由硬件系统引入错误的机会。此外,因为嵌入式操做系统屏蔽了底层硬件的复杂性,使得开发者经过操做系统提供的API函数就能够完成大部分工做,所以大大简化了开发过程,提升了系统的稳定性。嵌入式系统的开发者如今已经从反复进行硬件平台设计的过程当中解脱出来,从而能够将主要精力放在知足特定的需求上。
嵌入式系统一般是一个资源受限的系统,所以直接在嵌入式系统的硬件平台上编写软件比较困难,有时候甚至是不可能的。目前通常采用的解决办法是首先在通用计算机上编写程序,而后经过交叉编译生成目标平台上能够运行的二进制代码格式,最后再下载到目标平台上的特定位置上运行。
须要交叉开发环境(Cross Development Environment)的支持是嵌入式应用软件开发时的一个显著特色,交叉开发环境是指编译、连接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有所不一样,一般采用宿主机/目标机模式,如图3所示。
宿主机(Host)是一台通用计算机(如PC机或者工做站),它经过串口或者以太网接口与目标机通讯。宿主机的软硬件资源比较丰富,不但包括功能强大的操做系统(如Windows和Linux),并且还有各类各样优秀的开发工具(如WindRiver的Tornado、Microsoft的Embedded Visual C++等),可以大大提升嵌入式应用软件的开发速度和效率。
目标机(Target)通常在嵌入式应用软件开发期间使用,用来区别与嵌入式系统通讯的宿主机,它能够是嵌入式应用软件的实际运行环境,也能够是可以替代实际运行环境的仿真系统,但软硬件资源一般都比较有限。嵌入式系统的交叉开发环境通常包括交叉编译器、交叉调试器和系统仿真器,其中交叉编译器用于在宿主机上生成能在目标机上运行的代码,而交叉调试器和系统仿真器则用于在宿主机与目标机间完成嵌入式软件的调试。在采用宿主机/目标机模式开发嵌入式应用软件时,首先利用宿主机上丰富的资源和良好的开发环境开发和仿真调试目标机上的软件,而后经过串口或者以网络将交叉编译生成的目标代码传输并装载到目标机上,并在监控程序或者操做系统的支持下利用交叉调试器进行分析和调试,最后目标机在特定环境下脱离宿主机单独运行。
创建交叉开发环境是进行嵌入式软件开发的第一步,目前经常使用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型表明是GNU工具链、目前已经可以支持x8六、ARM、MIPS、PowerPC等多种处理器。商业的交叉开发环境则主要有Metrowerks CodeWarrior、ARM Software Development Toolkit、SDS Cross compiler、WindRiver Tornado、Microsoft Embedded Visual C++等。
3.2 交叉编译和连接
在完成嵌入式软件的编码以后,须要进行编译和连接以生成可执行代码,因为开发过程大可能是在使用Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器,这就要求在创建好的交叉开发环境中进行交叉编译和连接。
交叉编译器和交叉连接器是可以在宿主机上运行,而且可以生成在目标机上直接运行的二进制代码的编译器和连接器。例如在基于ARM体系结构的gcc交叉开发环境中,arm-linux-gcc是交叉编译器,arm-linux-ld是交叉连接器。一般状况下,并非每一种体系结构的嵌入式微处理器都只对应于一种交叉编译器和交叉连接器,好比对于M68K体系结构的gcc交叉开发环境而言,就对应于多种不一样的编译器和连接器。若是使用的是 COFF格式的可执行文件,那么在编译Linux内核时须要使用m68k-coff-gcc和m68k-coff-ld,而在编译应用程序时则须要使用 m68k-coff-pic-gcc和m68k-coff-pic-ld。
嵌入式系统在连接过程当中一般都要求使用较小的函数库,以便最后产生的可执行代码可以尽量地小,所以实际运用时通常使用通过特殊处理的函数库。对于嵌入式Linux系统来说,功能愈来愈强、体积愈来愈大的C语言函数库 glibc和数学函数库libm已经很难知足实际的须要,所以须要采用它们的精化版本uClibc、uClibm和newlib等。
目前嵌入式的集成开发环境都支持交叉编译和交叉连接,如WindRiver Tornado和GNU工具链等,编写好的嵌入式软件通过交叉编译和交叉连接后一般会生成两种类型的可执行文件:用于调试的可执行文件和用于固化的可执行文件。
3.3 交叉调试
嵌入式软件通过编译和连接后即进入调试阶段,调试是软件开发过程当中必不可少的一个环节,嵌入式软件开发过程当中的交叉调试与通用软件开发过程当中的调试方式有所差异。在通用软件开发中,调试器与被调试的程序每每运行在同一台计算机上,调试器是一个单独运行着的进程,它经过操做系统提供的调试接口来控制被调试的进程。而在嵌入式软件开发中,调试时采用的是在宿主机和目标机之间进行的交叉调试,调试器仍然运行在宿主机的通用操做系统之上,但被调试的进程倒是运行在基于特定硬件平台的嵌入式操做系统中,调试器和被调试进程经过串口或者网络进行通讯,调试器能够控制、访问被调试进程,读取被调试进程的当前状态,并可以改变被调试进程的运行状态。
交叉调试(Cross Debug)又经常被称为远程调试(Remote Debug),是一种容许调试器以某种方式控制目标机上被调试进程的运行方式,并具备查看和修改目标机上内存单元、寄存器以及被调试进程中变量值等各类调试功能的调试方式。通常而言,远程调试过程的结构如图4所示。
嵌入式系统的交叉调试有多种方法,能够被细分红不一样的层次,但通常都具备以下一些典型特色:
在嵌入式软件开发过程当中的调试方式有不少种,应根据实际的开发要求和条件进行选择。就调试方法而言,嵌入式系统的交叉调试能够分为硬件调试和软件调试两种,前者使用仿真调试器协助调试过程,然后者则使用软件调试器完成调试过程。
硬件调试
相对于软件调试而言,使用硬件调试器能够得到更强大的调试功能和更优秀的调试性能。硬件调试器的基本原理是经过仿真硬件的执行过程,让开发者在调试时能够随时了解到系统的当前执行状况。目前嵌入式系统开发中最经常使用到的硬件调试器是ROM Monitor、ROM Emulator、In-Circuit Emulator和In-Circuit Debugger。
采用ROM Monitor方式进行交叉调试须要在宿主机上运行调试器,在目标机上运行ROM监视器(ROM Monitor)和被调试程序,宿主机经过调试器与目标机上的ROM监视器创建通讯链接,它们之间的通讯遵循远程调试协议。ROM监视器能够是一段运行在目标机ROM上的可执行程序,也能够是一个专门的硬件调试设备,它负责监控目标机上被调试程序的运行状况,可以与宿主机端的调试器一同完成对应用程序的调试。在使用这种调试方式时,被调试程序首先经过ROM监视器下载到目标机,而后在ROM监视器的监控下完成调试,目前使用的绝大部分ROM监视器可以完成设置断点、单步执行、查看寄存器、修改内存空间等各项调试功能。
采用ROM Emulator方式进行交叉调试时须要使用ROM仿真器,它一般被插入到目标机上的ROM插槽中,专门用于仿真目标机上的ROM芯片。在使用这种调试方式时,被调试程序首先下载到ROM仿真器中,它等效于下载到目标机的ROM芯片上,而后在ROM仿真器中完成对目标程序的调试。ROM Emulator调试方式经过使用一个ROM仿真器,虽然避免了每次修改程序后都必须从新烧写到目标机ROM中这一费时费力的操做,但因为ROM仿真器自己比较昂贵,功能相对来说又比较单一,所以只适应于某些特定场合。
采用In-Circuit Emulator(ICE)方式进行交叉调试时须要使用在线仿真器,它是仿照目标机上的CPU而专门设计的硬件,能够彻底仿真处理器芯片的行为,而且提供了很是丰富的调试功能。在使用在线仿真器进行调试的过程当中,能够按顺序单步执行,也能够倒退执行,还能够实时查看全部须要的数据,从而给调试过程带来了不少的便利。嵌入式系统应用的一个显著特色是与现实世界中的硬件直接相关,存在各类异变和事先未知的变化,从而给微处理器的指令执行带来各类不肯定因素,这种不肯定性在目前状况下只有经过在线仿真器才有可能发现,所以尽管在线仿真器的价格很是昂贵,但仍然获得了很是普遍的应用。
采用In- Circuit Debugger(ICD)方式进行交叉调试时须要使用在线调试器。因为ICE的价格很是昂贵,而且每种CPU都须要一种与之对应的ICE,使得开发成本很是高,一个比较好的解决办法是让CPU直接在其内部实现调试功能,并经过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。目前 Motorola公司提供的开发板上使用的是DBM调试端口,而ARM公司提供的开发板上使用的则是JTAG调试端口,使用合适的软件工具与这些调试端口进行链接,能够得到与ICE相似的调试效果。
软件调试
软件调试一般要在不一样的层次上进行,有时可能须要对嵌入式操做系统的内核进行调试,而有时可能仅仅只须要调试嵌入式应用程序就能够了。在嵌入式系统的整个开发过程当中,不一样层次上的软件调试须要使用不一样的调试方法。
嵌入式操做系统的内核调试相对来说比较困难,这是由于在内核中不便于增长一个调试器程序,而只能经过远程调试的方法,经过串口和操做系统内置的"调试桩" (debug stub)进行通讯,共同完成调试过程。调试桩能够当作是一个调试服务器,它经过操做系统得到一些必要的调试信息,而且负责处理宿主机发送来的调试命令。具体到嵌入式Linux系统内核,调试时能够先在Linux内核中设置一个调试桩,用做调试过程当中和宿主机之间的通讯服务器,而后就能够在宿主机中经过调试器的串口与调试桩进行通讯,并经过调试器控制目标机上Linux内核的运行。
嵌入式应用软件的调试可使用本地调试和远程调试两种方法,相对于操做系统的调试而言,这两种方式都比较简单。若是采用的是本地调试,首先要将所需的调试器移植到目标系统中,而后就能够直接在目标机上运行调试器来调试应用程序了;若是采用的是远程调试,则须要移植一个调试服务器到目标系统中,并经过它与宿主机上的调试器共同完成应用程序的调试。在嵌入式Linux 系统的开发中,远程调试时目标机上使用的调试服务器一般是gdbserver,而宿主机上使用的调试器则是gdb,二者相互配合共同完成调试过程。
3.4 系统测试
嵌入式系统的硬件通常采用专门的测试仪器进行测试,而软件则须要有相关的测试技术和测试工具的支持,并要采用特定的测试策略。测试技术指的是软件测试的专门途径,以及可以更加有效地运用这些途径的特定方法。在嵌入式软件测试中,经常要在基于目标机的测试和基于宿主机的测试之间作出折衷,基于目标机的测试须要消耗较多的时间和经费,而基于宿主机的测试虽然代价较小,但毕竟是在仿真环境中进行的,所以难以彻底反映软件运行时的实际状况。这两种环境下的测试能够发现不一样的软件缺陷,关键是要对目标机环境和宿主机环境下的测试内容进行合理取舍。
测试工具指的是那些可以用来辅助测试的工具,测试工具主要用来支持测试人员的测试工做,自己不能直接用来进行测试,测试工具通常都是通用工具,测试人员应该根据实际状况对它们进行适当的调整。嵌入式软件测试中常常用到测试工具主要有内存分析工具、性能分析工具、覆盖分析工具、缺陷跟踪工具等。
内存分析工具
嵌入式系统的内存资源一般是受限的,内存分析工具能够用来处理在进行动态内存分配时产生的缺陷。当动态分配的内存被错误地引用时,产生的错误一般难以再现,可出现的失效难以追踪,使用内存分析工具能够很好地检测出这类缺陷。目前经常使用的内存分析工具备软件和硬件两种,基于软件的内存分析工具可能会对代码的执行性能带来很大影响,从而影响系统的实时性;基于硬件的内存分析工具价格昂贵,而且只能在特定的环境中使用。
性能分析工具
嵌入式系统的性能一般是一个很是关键的因素,开发人员通常须要对系统的某些关键代码进行优化来改进性能,而首先遇到的问题天然就是肯定须要对哪些代码进行优化。性能分析工具能够为开发人员提供有关的数据,说明执行时间是如何消耗的,是何时消耗的,以及每一个进程所使用的时间。这些数据能够帮助肯定哪些进程消耗了过多的执行时间,从而能够决定如何优化软件,以得到更好的时间性能。此外,性能分析工具还能够引导开发人员发如今系统调用中存在的错误以及程序结构上的缺陷。
覆盖分析工具
在进行白盒测试时,可使用代码覆盖分析工具追踪哪些代码被执行过,分析过程通常经过插桩来完成,插桩能够是在测试环境中嵌入硬件,也能够是在可执行代码中加入软件,或者是二者的结合。开发人员经过对分析结果进行总结,能够肯定哪些代码被执行过,哪些代码被遗漏了。目前经常使用的覆盖分析工具通常都会提供有关功能覆盖、分支覆盖、条件覆盖等信息。
现今的嵌入式系统在网络化潮流的推进下,已经逐渐摆脱过去那种小巧而简单的模式,开始进入复杂度高、功能强大的阶段,吸引了许多程序设计人员和硬件开发人员的视线。本文讨论了嵌入式Linux系统的基本知识、开发流程、开发工具、调试工具、测试工具等,并指出了嵌入式系统的开发与通常通用计算机软件开发的不一样点及应该注意的事项,这些都是从此在进行嵌入式Linux系统开发时必须具有的基础知识。