嵌入式Linux开发(转载)

导读:
  随着信息化技术的发展和数字化产品的普及,以计算机技术、芯片技术和软件技术为核心的嵌入式系统再度成为当前研究和应用的热点,通信、计算机、消费电子技术(3C)合一的趋势正在逐步形成,无所不在的网络和无所不在的计算(everything connecting, everywhere computing)正在将人类带入一个崭新的信息社会。
  一、嵌入式系统
  嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件是可裁剪的,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。嵌入式系统最典型的特点是与人们的日常生活紧密相关,任何一个普通人都可能拥有各类形形色色运用了嵌入式技术的电子产品,小到MP3、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技术的结合正在推动着嵌入式技术的飞速发展,嵌入式系统的研究和应用产生了如下新的显著变化:
  新的微处理器层出不穷,嵌入式操作系统自身结构的设计更加便于移植,能够在短时间内支持更多的微处理器。
  嵌入式系统的开发成了一项系统工程,开发厂商不仅要提供嵌入式软硬件系统本身,同时还要提供强大的硬件开发工具和软件支持包。
  通用计算机上使用的新技术、新观念开始逐步移植到嵌入式系统中,如嵌入式数据库、移动代理、实时CORBA等,嵌入式软件平台得到进一步完善。
  各类嵌入式Linux操作系统迅速发展,由于具有源代码开放、系统内核小、执行效率高、网络结构完整等特点,很适合信息家电等嵌入式系统的需要,目前已经形成了能与Windows CE、Palm OS等嵌入式操作系统进行有力竞争的局面。
  网络化、信息化的要求随着Internet技术的成熟和带宽的提高而日益突出,以往功能单一的设备如电话、手机、冰箱、微波炉等功能不再单一,结构变得更加复杂,网络互联成为必然趋势。
  精简系统内核,优化关键算法,降低功耗和软硬件成本。
  提供更加友好的多媒体人机交互界面。
  1.2 体系结构
  根据国际电气和电子工程师协会(IEEE)的定义,嵌入式系统是”控制、监视或者辅助设备、机器和车间运行的装置”(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。一般而言,整个嵌入式系统的体系结构可以分成四个部分:嵌入式处理器、嵌入式外围设备、嵌入式操作系统和嵌入式应用软件,如图1所示。
  图1 嵌入式系统的组成
  

嵌入式Linux开发(转载)
  
  嵌入式系统发展到今天,对应于各种微处理器的硬件平台一般都是通用的、固定的、成熟的,这就大大减少了由硬件系统引入错误的机会。此外,由于嵌入式操作系统屏蔽了底层硬件的复杂性,使得开发者通过操作系统提供的API函数就可以完成大部分工作,因此大大简化了开发过程,提高了系统的稳定性。嵌入式系统的开发者现在已经从反复进行硬件平台设计的过程中解脱出来,从而可以将主要精力放在满足特定的需求上。
  嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件比较困难,有时候甚至是不可能的。目前一般采用的解决办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台上可以运行的二进制代码格式,最后再下载到目标平台上的特定位置上运行。
  需要交叉开发环境(Cross Development Environment)的支持是嵌入式应用软件开发时的一个显著特点,交叉开发环境是指编译、链接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式,如图3所示。
  图3 交叉开发环境
   嵌入式Linux开发(转载)
  
  嵌入式系统的交叉调试有多种方法,可以被细分成不同的层次,但一般都具有如下一些典型特点:
  调试器和被调试进程运行在不同的机器上,调试器运行在PC或者工作站上(宿主机),而被调试的进程则运行在各种专业调试板上(目标机)。
  调试器通过某种通信方式与被调试进程建立联系,如串口、并口、网络、DBM、JTAG或者专用的通信方式。
  在目标机上一般会具备某种形式的调试代理,它负责与调试器共同配合完成对目标机上运行着的进程的调试。这种调试代理可能是某些支持调试功能的硬件设备(如DBI 2000),也可能是某些专门的调试软件(如gdbserver)。
  目标机可能是某种形式的系统仿真器,通过在宿主机上运行目标机的仿真软件,整个调试过程可以在一台计算机上运行。此时物理上虽然只有一台计算机,但逻辑上仍然存在着宿主机和目标机的区别。
  在嵌入式软件开发过程中的调试方式有很多种,应根据实际的开发要求和条件进行选择。就调试方法而言,嵌入式系统的交叉调试可以分为硬件调试和软件调试两种,前者使用仿真调试器协助调试过程,而后者则使用软件调试器完成调试过程。
  硬件调试
  相对于软件调试而言,使用硬件调试器可以获得更强大的调试功能和更优秀的调试性能。硬件调试器的基本原理是通过仿真硬件的执行过程,让开发者在调试时可以随时了解到系统的当前执行情况。目前嵌入式系统开发中最常用到的硬件调试器是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系统开发时必须具备的基础知识。
  参考资料
  http://www.embeddedtechnology.com是嵌入式系统技术的核心网站,包括许多最新的嵌入式领域的技术动态,以及大量的嵌入式产品、开发工具、产品提供商的介绍。
  http://www.ddjembedded.com是嵌入式系统杂志《Dr. Dobb’s Embedded Systems》的官方网站,包含大量与嵌入式系统相关的文章。
  Karim Yaghmour,Building Embedded Linux Systems,USA:O’Reilly,2003
  魏忠,蔡勇,雷红卫编著,嵌入式开发详解,北京:电子工业出版社,2003
  李善平,刘文峰,王焕龙等编著,Linux与嵌入式系统,北京:清华大学出版社,2003
  探矽工作室著,嵌入式系统开发圣经,北京:中国铁道出版社,2003
  关于作者
  本文作者肖文鹏是北京理工大学计算机系的硕士研究生,主要从事操作系统和分布式计算环境的研究,喜爱Linux和Python。你可以通过 xiaowp@263.net)与他取得联系。

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24898 人正在系统学习中

来源:suqianmawei

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2012年6月4日
下一篇 2012年6月4日

相关推荐