﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-君子性非异也，善假于物也。-文章分类-探索嵌入式开发</title><link>http://www.cppblog.com/xushaohua/category/2313.html</link><description>如有恒，何须三更起，半夜眠；最怕莫，三天打鱼两天晒网，竹篮打水一场空！</description><language>zh-cn</language><lastBuildDate>Sun, 25 May 2008 22:38:28 GMT</lastBuildDate><pubDate>Sun, 25 May 2008 22:38:28 GMT</pubDate><ttl>60</ttl><item><title>[转]同济大学软件学院院长谈择业——关于嵌入式方向 </title><link>http://www.cppblog.com/xushaohua/articles/17597.html</link><dc:creator>shaohua</dc:creator><author>shaohua</author><pubDate>Sat, 13 Jan 2007 11:22:00 GMT</pubDate><guid>http://www.cppblog.com/xushaohua/articles/17597.html</guid><wfw:comment>http://www.cppblog.com/xushaohua/comments/17597.html</wfw:comment><comments>http://www.cppblog.com/xushaohua/articles/17597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xushaohua/comments/commentRss/17597.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xushaohua/services/trackbacks/17597.html</trackback:ping><description><![CDATA[
		<p>关于嵌入式系统方向 <br />　　嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上，通常这些设备的硬件资源(如处理器、存储器等)非常有限，并且对成本很敏感，有时对实时响应要求很高等。特别是随着消费家电的智能化，嵌入式更显重要。像我们平常常见到的手 <br />机、PDA、电子字典、可视电话、VCD/DVD/MP3 Player、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(Set Top Box)、高清电视(HDTV)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等都是典型的嵌入式系统。 </p>
		<p>　　嵌入式系统是软硬结合的东西，搞嵌入式开发的人有两类。 </p>
		<p>　　一类是学电子工程、通信工程等偏硬件专业出身的人，他们主要是搞硬件设计，有时要开发一些与硬件关系最密切的最底层软件，如BootLoader、Board Support <br />Package(像PC的BIOS一样，往下驱动硬件，往上支持操作系统)，最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚，不足是他们更擅长定义各种硬件接口，但对复杂软件系统往往力不从心(例如嵌入式操作系统原理和复杂应用软件等)。 </p>
		<p>　　另一类是学软件、计算机专业出身的人，主要从事嵌入式操作系统和应用软件的开发。如果我们学软件的人对硬件原理和接口有较好的掌握，我们完全也可写BSP和硬件驱动程序。嵌入式硬件设计完后，各种功能就全靠软件来实现了，嵌入式设备的增值很大程度上取决于嵌入式软件， <br />这占了嵌入式系统的最主要工作(目前有很多公司将硬件设计包给了专门的硬件公司，稍复杂的硬件都交给台湾或国外公司设计，国内的硬件设计力量很弱，很多嵌入式公司自己只负责开发软件，因为公司都知道，嵌入式产品的差异很大程度在软件上，在软件方面是最有“花头“可做的)， <br />所以我们搞软件的人完全不用担心我们在嵌入式市场上的用武之地，越是智能设备越是复杂系统，软件越起关键作用，而且这是目前的趋势。 </p>
		<p>　　从事嵌入式软件开发的好处是: </p>
		<p>　　(1) <br />目前国内外这方面的人都很稀缺。一方面，是因为这一领域入门门槛较高，不仅要懂较底层软件(例如操作系统级、驱动程序级软件)，对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高)，而且必须懂得硬件的工作原理，所以非专业IT人员很难切入这一领域另一方 <br />面，是因为这一领域较新，目前发展太快，很多软硬件技术出现时间不长或正在出现(如ARM处理器、嵌入式操作系统、MPEG技术、无线通信协议等)，掌握这些新技术的人当然很找。嵌入式人才稀缺，身价自然就高，越有经验价格就越高。其实嵌入式人才稀少根本原因可能是大多数人无条 <br />件接触这需要相应的嵌入式开发板和软件另外需要有经验的人进行指导开发流程。 </p>
		<p>　　(2) <br />与企业计算等应用软件不同，嵌入式领域人才的工作强度通常低一些(但收入不低)。搞企业应用软件的IT企业，这个用户的系统搞完了，又得去搞下一个用户的，而且每个用户的需求和完成时间都得按客户要求改变，往往疲于奔命，重复劳动。相比而言，搞嵌入式系统的公司，都有自己的 <br />产品计划，按自己的节奏行事。所开发的产品通常是通用的，不会因客户的不同而修改。一个产品型号开发完了，往往有较长一段空闲时间(或只是对软件进行一些小修补)，有时间进行充电和休整。另外，从事嵌入式软件的每个人工作范围相对狭窄，所涉及的专业技术范围就是那些(ARM、 <br />RTOS、MPEG、802.11等)，时间长了这些东西会越搞越有经验，卖卖老本，几句指导也够让那些初入道者琢磨半年的。若搞应用软件，可能下一个客户要换成一个完全不同的软件开发平台，那就苦了。 </p>
		<p>　　(3) <br />哪天若想创业，搞自已的产品，那么嵌入式是一个不错的主意，这可不像应用软件那样容易被盗版。土木学院有一个叫启明星的公司开发出一个好象叫“工程e”的掌上PDA(南校区门口有广告)，施工技术人员用该PDA可当场进行土木概预算和其它土木计算，据说销路特好。我认识的某大学 <br />老师，他开发的饭馆用的点菜PDA(WinCE平台，可无线连网和上网)，据他说销路不错，饭馆点点PDA让客户点菜，多显派头档次。我记得00级22班当年有一组同学在学Windows程序设计课程时用VC设计了一个功能很强的点菜系统做为课程项目，当时真想建议他们将这个软件做成PDA，估计会 <br />有些销路(上海火车站南广场的Macdonald便使用很漂亮的PDA给用户点食品，像摸像样的)。这些PDA的硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM)，都是通用的硬件，我们只管设计软件就变成自己的产品了。 </p>
		<p>　　从事嵌入式软件开发的缺点是: </p>
		<p>　　(1) 入门起点较高，所用到的技术往往都有一定难度，若软硬件基础不好，特别是操作系统级软件功底不深，则可能不适于此行。 </p>
		<p>　　(2) <br />这方面的企业数量要远少于企业计算类企业。特别是从事嵌入式的小企业数量较多(小企业要搞自己的产品创业)，知名大公司较少(搞嵌入式的大公司主要有Intel、Motorola、TI、Philip、Samsung、Sony、Futjtum、Bell-Alcatel、意法半导体、Microtek、研华、华为、中兴通信、上广电 <br />等制造类企业)。这些企业的习惯思维方式是到电子、通信等偏硬专业找人。由于正规高校软件学院以前毕业生以企业计算为主，所以正规高校软件学院与这些企业联系相对较少。正规高校软件学院正积极努力，目前已与其中部分公司建立了联系，争取今后能有正规高校软件学院同学到这 <br />些企业中实习或就业。 </p>
		<p>　　(3)有少数公司经常要硕士以上的人搞嵌入式，主要是基于嵌入式的难度。但大多数公司也并无此要求，只要有经验即可。 </p>
		<p>　　正规高校软件学院同学若学习嵌入式，显然应偏重于嵌入式软件，特别是嵌入式操作系统方面，应是我们的强项。对于搞嵌入式软件的人，最重要的技术显然是(实际上很多公司的招聘广告上就是这样写的): </p>
		<p>　　(1) 掌握主流嵌入式微处理器的结构与原理 </p>
		<p>　　(2) 必须掌握一个嵌入式操作系统 </p>
		<p>　　(3) 必须熟悉嵌入式软件开发流程并至少做过一个嵌入式软件项目。 </p>
		<p>　　正规高校软件学院在嵌入式软件方面最重要的课程包括: </p>
		<p>　　(1) <br />嵌入式微处理器结构与应用:这是一门嵌入式硬件基础课程，正规高校软件学院用这门课取代了传统的“微机原理与接口”课程(目前国内已有少部分高校IT专业这样做了，因为讲x86微机原理与接口很难找到实际用处，只为教学而已)。我们说过，嵌入式是软硬件结合的技术，搞嵌入式软件 <br />的人应对ARM处理器工作原理和接口技术有充分了解，包括ARM的汇编指令系统。若不了解处理器原理，怎么能控制硬件工作，怎么能写出节省内存又运行高速的最优代码(嵌入式软件设计特别讲究时空效率)，怎么能写出驱动程序(驱动程序都是与硬件打交道的)很多公司招聘嵌入式软件人员 <br />时都要求熟悉ARM处理器，将来若同学到公司中从事嵌入式软件开发，公司都会给你一本该设备的硬件规格说明书 (xxx <br />Specification)，您必须能看懂其中的内存分布和端口使用等最基本的说明(就像x86汇编一样)，否则怎么设计软件。有些同学觉得嵌入式处理器课程较枯燥，这主要是硬件课程都较抽象的原因，等我们的嵌入式实验室10月份建好后，您做了一些实验后就会觉得看得见摸得着。还有同学对A <br />RM汇编不感兴趣，以为嵌入式开发用C语言就足够了。其实不应仅是将汇编语言当成一个程序设计语言，学汇编主要是为了掌握处理器工作原理的。一个不熟悉汇编语言的人，怎么能在该处理器写出最优的C语言代码。在嵌入式开发的一些关键部分，有时还必须写汇编，如Bootloader等(可 <br />能还包括BSP)。特别是在对速度有极高要求的场合(如DSP处理器的高速图像采集和图像解压缩)，目前主要还要靠汇编写程序(我看到过很多公司是这样做的)。当您在一个嵌入式公司工作时，在查看描述原理的手册时，可能很多都是用汇编描述的(我就遇到过)，这是因为很多硬件设计人员 <br />只会写或者喜欢用汇编描述，此时您就必须看懂汇编程序，否则软硬件人员可能就无法交流。很多嵌入式职位招聘时都要求熟悉汇编。 </p>
		<p>　　(2) 嵌入式操作系统类课程 </p>
		<p>　　除了WinCE的实时性稍差外，大多数嵌入式操作系统的实时性都很强所以也可称为实时操作系统Real Time Operating System.从事嵌入式的人至少须掌握一个嵌入式操作系统(当然掌握两个更好)这在嵌入式的所有技术中是最为关键的了。目前最重要的RTOS主要包括: </p>
		<p>　　第一类、传统的经典RTOS:最主要的便是Vxworks操作系统，以及其Tornado开发平台。Vxworks因出现稍早，实时性很强(据说可在1ms内响应外部事件请求)，并且内核可极微(据说最小可8K)，可靠性较高等，所以在北美，Vxworks占据了嵌入式系统的多半疆山。特别是在通信设备等实时 <br />性要求较高的系统中，几乎非Vxworks莫属。Vxworks的很多概念和技术都和Linux很类似，主要是C语言开发。像Bell-alcatel、Lucent、华为等通信企业在开发产品时，Vxworks用得很多。但Vxworks因价格很高，所以一些小公司或小产品中往往用不起。目前很多公司都在往嵌入式Linux转( <br />听说华为目前正在这样转)。但无论如何，Vxworks在一段长时间内仍是不可动摇的。与Vxworks类似的稍有名的实时操作系统还有pSOS、QNX、Nucleus等RTOS。 </p>
		<p>　　第二类、嵌入式Linux操作系统:Linux的前途除作为服务器操作系统外，最成功的便是在嵌入式领域的应用，原因当然是免费、开源、支持软件多、呼拥者众，这样嵌入式产品成本会低。Linux本身不是一个为嵌入式设计的操作系统，不是微内核的，并且实时性不强。目前应用在嵌入式 <br />领域的Linux系统主要有两类:一类是专为嵌入式设计的已被裁减过的Linux系统，最常用的是uClinux(不带MMU功能)，目前占较大应用份额，可在ARM7上跑另一类是跑在ARM 9上的，一般是将Linux 2.4.18内核移植在其上，可使用更多的Linux功能(当然uClinux更可跑在ARM <br />9上)。很多人预测，嵌入式Linux预计将占嵌入式操作系统的50以上份额，非常重要。缺点是熟悉Linux的人太少，开发难度稍大。另外，目前我们能发现很多教材和很多大学都以ucOS/II为教学用实时操作系统，这主要是由于ucOS/II较简单，且开源，非常适合入门者学习实时操作系统原理 <br />，但由于ucOS/II功能有限，实用用得较少，所以正规高校软件学院不将其作为教学重点，要学习就应学直接实用的，比如 <br />uClinux就很实用。况且熟悉了Linux开发，不仅在嵌入式领域有用，对开发Linux应用软件，对加深操作系统的认识也有帮助，可谓一举多得。据我所知，目前Intel、Philip都在大搞ARMLINUX的嵌入式开发，Fujitum则是在自己的处理器上大搞Linux开发。目前在嵌入式Linux领域，以下几 <br />个方面的人特别难找，一是能将Linux移植到某个新型号的开发版上二是能写Linux驱动程序的人三是熟悉Linux内核裁减和优化的人。正规高校软件学院在该嵌入式Linux方面的课程系列是:本科生操作系统必修课，然后是Linux程序设计选修课，最后是嵌入式Linux系统选修课。正规高校软 <br />件学院在Linux方面目前已有较强力量，魏老师和张老师熟悉Linux开发，金老师和唐老师熟悉Linux系统管理。 </p>
		<p>　　第三类、 Windows <br />CE嵌入式操作系统:Microsoft也看准了嵌入式的巨大市场，MS永远是最厉害的，WinCE出来只有几年时间，但目前已占据了很大市场份额，特别是在PDA、手机、显示仪表等界面要求较高或者要求快速开发的场合，WinCE目前已很流行(据说有一家卖工控机的公司板子卖得太好，以至来不及为 <br />客户裁减WinCE)。WinCE目前主要为4.2版(.NET)，开发平台主要为WinCE Platform <br />Builder，有时也用EVC环境开发一些较上层的应用，由于WinCE开发都是大家熟悉的VC环境，所以正规高校软件学院学过Windows程序设计课程的同学都不会有多大难度，这也是WinCE容易被人们接受的原因，开发环境方便快速，微软的强大技术支持，WinCE开发难度远低于嵌入式Linux。对 <br />于急于完成，不想拿嵌入式Linux冒险的开发场合，WinCE是最合适了(找嵌入式Linux的人可没那么好找的)，毕竟公司不能像学生学习那样试试看，保证开发成功更重要。根据不同的侧重点 ，WinCE还有两个特殊版本，一个是MS PocketPC操作系统专用于PDA上(掌上电脑)，另一个是MS <br />SmartPhone操作系统用于智能手机上(带PDA功能的手机)，两者也都属于WinCE平台。在PDA和手机市场上，除WinCE外，著名的PDA嵌入式操作系统还有Palm <br />OS(因出现很早，很有名)、Symbian等，但在WinCE的强劲冲击下，Palm和Symbian来日还能有多长正规高校软件学院可能是全国高校中唯一一家开设专门的“Windows <br />CE嵌入式操作系统“课程的学校，这主要是基于以下原因:正规高校软件学院本身前面便有Windows程序设计课程，同学学过VC后再学WinCE非常方便自然，通过学习WinCE同样也可了解嵌入式软件的一般开发过程，对Linux有惧怕心理的同学也很合适。很显然，嵌入式Linux永远不可能替代Wi <br />nCE，而且将来谁占份额大还很难讲，毕竟很多人更愿意接受MS的平台，就像各国政府都在大力推LINUX已好长时间，但您能看到几个在PC机上真正使用LINUX的用户据我观察目前在嵌入式平台上LINUX是叫得最响但还是WinCE实际用得更多.嵌入式LINUX可能更多地是一些有长远产品计划的公 <br />司为降低成本而进行长远考虑 二是微软亚洲研究院对正规高校软件学院WinCE课程的支持计划，我们也很希望将来正规高校软件学院能有同学通过微软的面试去实习。WinCE和多媒体(如MPEG技术)是微软亚洲工程院目前做得较多的项目领域之一他们很需要精通WinCE的人。 </p>
		<p>　　总结关于嵌入式操作系统类课程，若您觉得自己功底较深且能钻研下去，则可去学嵌入式Linux若您觉得自己VC功底较好且想短平快地学嵌入式开发，则正规高校软件学院的WinCE课程是最好的选择。 </p>
		<p>　　(3) 嵌入式开发的其它相关软件课程 </p>
		<p>　　搞嵌入式若能熟悉嵌入式应用的一些主要领域，这样的人更受企业欢迎。主要的相关领域包括: </p>
		<p>　　A、数字图像压缩技术:这是嵌入式最重要最热门的应用领域之一，主要是应掌握MPEG编解码算法和技术，如DVD、MP3、PDA、高精电视、机顶盒等都涉及MPEG高速解码问题。为此，正规高校软件学院已预订了一位能开设数字图像处理课程的博士。 </p>
		<p>　　B、通信协议及编程技术:这包括传统的TCP/IP协议和热门的无线通信协议。首先，大多数嵌入式设备都要连入局域网或Internet，所以首先应掌握TCP/IP协议及其编程，这是需首要掌握的基本技术其次，无线通信是目前的大趋势，所以掌握无线通信协议及编程也是是很重要的。无结通 <br />信协议包括无线局域网通信协议802.11系列，Bluetooth，以及移动通信(如GPRS、GSM、CDMA等)。 </p>
		<p>　　C、网络与信息安全技术:如加密技术，数字证书CA等。正规高校软件学院有这方面的选修课。 </p>
		<p>　　D、DSP技术:DSP是Digital Signal <br />Process数字信号处理的意思，DSP处理器通过硬件实现数字信号处理算法，如高速数据采集、压缩、解压缩、通信等。数字信号处理是电子、通信等硬件专业的课程，对于搞软件的人若能了解一下最好。目前DSP人才较缺。如果有信号与系统、数字信号处理等课程基础，对于学习MPEG编解 <br />码原理会有很大帮助。 </p>
		<p>　　(4)嵌入式开发的相关硬件基础 </p>
		<p>　　对于软件工程专业的学生，从事嵌入式软件开发，像数字电路、计算机组成原理、嵌入式微处理器结构等硬件课程是较重要的。另外，汇编语言、C/C、数据结构和算法、特别是操作系统等软件基础课也是十分重要的。我们的主要目地是能看懂硬件工作原理，但重点应是在嵌入式软件 <br />，特别操作系统级软件，那将是我们的优势。 </p>
		<p>　　我们的研究生里有些是学电子、通信类专业过来的，有较好的模拟电路和单片机基础，学嵌入式非常合适。嵌入式本身就是从单片机发展过来的，只是单片机不带OS，而现在很多嵌入式应用越来越复杂，以至不得不引入嵌入式操作系统。另外，为追求更高速的信号处理速度，现在在一 <br />些速度要求较高的场合，有不少公司是将一些DSP算法，如MPEG压缩解压缩算法等用硬件来实现，这就涉及到HDL数字电路设计技术及其FPGA/IP核实现技术，这方面的人目前市场上也很缺。 </p>
		<p>　　(5) 题外话 </p>
		<p>　　另外，能写驱动程序的人目前是非常紧缺的(驱动程序也可归于嵌入式范畴)，包括桌面Windows中的DDK开发环境和WDM驱动程序。公司每时每刻都要推出新产品，每一个新产品出来了，要能被操作系统所使用，是必须写驱动程序的。写驱动程序就必须掌握操作系统(如Windows或Linux) <br />的内部工作原理，还涉及到少量硬件知识，难度较大，所以这方面的人很难找。想成为高手的同学，也可从驱动程序方面获得突破。我可说一下自己的经历，三年前我曾短暂地在一家公司写过WinCE驱动程序(正是因为知道这方面的人紧缺，所以才要做这方面的事)，尽管那以前从未做过驱 <br />动程序，应聘那个职位时正是看准了公司是很难招聘到这方面的人，既然都找不到人，驱动还得有人做，这正是可能有机会切入这一领域的大好机会。面试时大讲自己写过多少万行汇编程序，对计算机工作原理如何清楚，简历中又写着我曾阅读完两本关于Windows Driver <br />Model的两本英文原版书，写过几个小型的驱动程序练习程序(其实根本没写过，我们的同学将来千万不要像我这样，早练就些过硬功夫，就不至于沦落到我这等地步，就不用像我那样去“欺骗”公司了，我这是一个典型的反面教材)，居然一切都PASS(当然最重要的是笔试和面试问题还说得 <br />过去)，这只能说明这一领域找人的困难程度。公司本就未指望找到搞过驱动的人，找个有相关基础的人就算不错了。做了以后，发现也并不是怎样难的。其实搞驱动程序的工作是很舒服的，搞完一个版本就会空一段时间，只有等公司新的芯片推出或新的OS出现后，才需要再去开发新一版 <br />驱动，那时有将近一个月时间空闲着在等WinCE .NET Beta版推出，准备将驱动程序升级到CE .NET上，现在在软件学院工作整日忙，无限怀念那段悠闲时光。 </p>
		<p>　　很巧合，最近本人无意中再次体会到了嵌入式的迷人之处。上周我那用了3年的手机终于不能WORK了。此次更新，除要求有手机常见功能外，最好有MP3功能(现在很多英语听力都有MP3文件)，最好有英汉词典，最好还能读WORD文档。最后选了个满足以上条件的最便宜的手机DOPOD <br />515(斩了我2.2K，但想想这也算自己对嵌入式事业的支持，这样便也想开了)，算得上最低档的智能手机了。回来一查，手机的about显示，本手机Processor是ARM，其OS是MS Smartphone(即WinCE .NET <br />4.2)，这么巧合，简直可做为学习嵌入式课程的产品案例了(等我们的WinCE课程开得有声有色后，希望能从微软研究院搞些Smartphone来开发开发)。有OS的手机果然了得，金山词霸、WORD、EXCEL、REGEDIT等居然都有smartphone版的，PC上的MP3、DOC等居然在download时都可被自动转换 <br />成smartphone格式，真是爽。完全可用Windows CE自己开发一些需要的程序download到自己的手机上。现在市面销售PDA智能手机火爆，MS总是财源滚滚。但我已发现国产的ARMLINUX手机出现在市面上，价格只1.2K。 </p>
		<p>　　在GOOGLE网上能搜索太多的关于嵌入式系统的讨论了，我刚发现一个http:www.embyte.com 非常不错，有很多有经验者谈自己的体会投入到其中的论坛中，你会切身感到嵌入式学习的热潮。 </p>
		<p>　　要么走ARMWinCE，要么走ARMLINUX，要么走ARMVXWORKS。每个搞嵌入式的人都可选一条路，条条大路通罗马。 </p>
<img src ="http://www.cppblog.com/xushaohua/aggbug/17597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xushaohua/" target="_blank">shaohua</a> 2007-01-13 19:22 <a href="http://www.cppblog.com/xushaohua/articles/17597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从软件的角度看嵌入式 Linux 系统</title><link>http://www.cppblog.com/xushaohua/articles/14588.html</link><dc:creator>shaohua</dc:creator><author>shaohua</author><pubDate>Thu, 02 Nov 2006 15:02:00 GMT</pubDate><guid>http://www.cppblog.com/xushaohua/articles/14588.html</guid><wfw:comment>http://www.cppblog.com/xushaohua/comments/14588.html</wfw:comment><comments>http://www.cppblog.com/xushaohua/articles/14588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xushaohua/comments/commentRss/14588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xushaohua/services/trackbacks/14588.html</trackback:ping><description><![CDATA[在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次： <br /><br />1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选)，和 Boot Loader 两大部分。 <br /><br />2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 <br /><br />3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。 <br /><br />4. 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有：MicroWindows 和 MiniGUI 懂。 <br /><br />引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道，PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader（比如，LILO 和 GRUB 等）一起组成。BIOS 在完成硬件检测和资源分配后，将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中，然后将控制权交给 OS Boot Loader。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中，然后跳转到内核的入口点去运行，也即开始启动操作系统。 <br /><br />而在嵌入式系统中，通常并没有像 BIOS 那样的固件程序（注，有的嵌入式 CPU 也会内嵌一段短小的启动程序），因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中，系统在上电或复位时通常都从地址 0x00000000 处开始执行，而在这个地址处安排的通常就是系统的 Boot Loader 程序。<img src ="http://www.cppblog.com/xushaohua/aggbug/14588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xushaohua/" target="_blank">shaohua</a> 2006-11-02 23:02 <a href="http://www.cppblog.com/xushaohua/articles/14588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式Linux开发站点</title><link>http://www.cppblog.com/xushaohua/articles/13774.html</link><dc:creator>shaohua</dc:creator><author>shaohua</author><pubDate>Tue, 17 Oct 2006 05:13:00 GMT</pubDate><guid>http://www.cppblog.com/xushaohua/articles/13774.html</guid><wfw:comment>http://www.cppblog.com/xushaohua/comments/13774.html</wfw:comment><comments>http://www.cppblog.com/xushaohua/articles/13774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xushaohua/comments/commentRss/13774.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xushaohua/services/trackbacks/13774.html</trackback:ping><description><![CDATA[
		<img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" />
		<a href="http://www.linuxsir.org/bbs/showthread.php?t=106634" target="_blank">http://www.linuxsir.org/bbs/showthread.php?t=106634</a>
		<br />
		<br />相关的新闻站点<br /><br />嵌入式开发网──新闻<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.embed.com.cn/news/newsmain.asp" target="_blank">http://www.embed.com.cn/news/newsmain.asp</a><br /><br /><br />国内有关嵌入式开发的论坛<br /><br />嵌入者之家论坛<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.embeder.com/bbs/index.asp" target="_blank">http://www.embeder.com/bbs/index.asp</a><br /><br />电子产品世界的论坛[2004年09月30日]<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://bbs.edw.com.cn/index.asp" target="_blank">http://bbs.edw.com.cn/index.asp</a><br /><br />恒颐高科论坛[2004年09月30日]<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.hyesco.com/forum/index.asp" target="_blank">http://www.hyesco.com/forum/index.asp</a><br /><br /><br />国内站点<br /><br />华恒公司的主页，里面有很多的相关资料，有待大家去发现<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.hhcn.com/chinese/embedlinux-res.html" target="_blank">http://www.hhcn.com/chinese/embedlinux-res.html</a><br /><br />SkyEye嵌入式硬件仿真项目<br />www.skyeye.org<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://gro.clinux.org/projects/skyeye/" target="_blank">http://gro.clinux.org/projects/skyeye/</a><br /><br />公社的SkyEye项目专栏<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.linuxfans.org/nuke/module...viewforum&amp;f=58" target="_blank">http://www.linuxfans.org/nuke/module...viewforum&amp;f=58</a><br /><br />SkyEye Project<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.huihoo.org/mirrors/skyeye/index.html" target="_blank">http://www.huihoo.org/mirrors/skyeye/index.html</a><br /><br />Pday水清木华，一个国内看嵌入式新闻的好地方！<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.pday.com.cn/" target="_blank">http://www.pday.com.cn/</a><br /><br />中国单片机公共实验室<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.bol-system.com/" target="_blank">http://www.bol-system.com/</a><br /><br />中国Linux论坛的嵌入式版，有很多开发板原理图的资料<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://openarm.linuxforum.net/" target="_blank">http://openarm.linuxforum.net/</a><br /><br />嵌入开发网<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.embed.com.cn/" target="_blank">http://www.embed.com.cn/</a><br /><br />北京科银京成技术公司<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.coretek.com.cn/" target="_blank">http://www.coretek.com.cn/</a><br /><br />微芯力科技<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.winsilicon.com/" target="_blank">http://www.winsilicon.com</a><br /><br />驱动开发网之嵌入式版块，挺综合的一个网站<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.driverdevelop.com/index.php" target="_blank">http://www.driverdevelop.com/index.php</a><br /><br />电子爱好者家园[2004年09月30日]<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://home.ee521.com/main.asp" target="_blank">http://home.ee521.com/main.asp</a><br /><br />广州友善之臂电子有限公司<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.arm9.net/index.asp" target="_blank">http://www.arm9.net/index.asp</a><br /><br />艾比德嵌入开发网<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.ebdev.com/" target="_blank">http://www.ebdev.com/</a><br /><br />嵌入式资讯网(非商业)[2006年01月22日]<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.embeded.cn/" target="_blank">http://www.embeded.cn</a><br /><br /><br />国外站点<br /><br />Linux设备网站，由Rick Lehrbaum创建和维护，是一个嵌入式Linux入门网站，其中包含嵌入式Linux行业的每日新闻、完整系列的快速参考指南、由重要开发者撰写的大量文章，还包括一个交互论坛。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.linuxdevices.com/" target="_blank">http://www.linuxdevices.com/</a><br /><br />下载嵌入式Linux交叉编译工具链的好地方<br />SnapGear Embedded Linux Distribution Home Page<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.snapgear.org/snapgear/index.html" target="_blank">http://www.snapgear.org/snapgear/index.html</a><br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.uclinux.org/pub/uClinux/u...f-tools/gcc-3/" target="_blank">http://www.uclinux.org/pub/uClinux/u...f-tools/gcc-3/</a><br /><br />嵌入式Linux联盟(ELC)，一个非盈利性的厂商中立的同业工会，其目标是在整个嵌入式、应用和设备市场中发展和推广Linux。<br />www.embedded-linux.org<br /><br />Beyond Logic公司主页，提供了许多嵌入式Linux系统开发的资料。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.beyondlogic.org/" target="_blank">http://www.beyondlogic.org</a><br /><br />嵌入式Linux期刊(ELJ，Embedded Linux Journal)，主要关注Linux和其他开源软件在嵌入式系统中的应用。 其中有很多业界领导者为ELJ撰写文章。<br />embedded.linuxjournal.com<br /><br />有几本写嵌入式Linux系统的书<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.embeddedlogic.com/ELSweb/booklinks.html" target="_blank">http://www.embeddedlogic.com/ELSweb/booklinks.html</a><br /><br />有关PowerPC体系的嵌入式<br />www.mvista.com<br />www.denx.de/e/index1.php<br /><br />IXP4XX Open Source Developers Guide<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://ixp4xx-osdg.sourceforge.net/" target="_blank">http://ixp4xx-osdg.sourceforge.net/</a><br /><br />uClinux/ARM项目<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://adam.kaist.ac.kr/~hschoe/notice.html" target="_blank">http://adam.kaist.ac.kr/~hschoe/notice.html</a><br /><br /><br />个人主页<br /><br />一个业余爱好者代礼周的个人主页，都是实践出来的<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.lomx.net/index.htm" target="_blank">http://www.lomx.net/index.htm</a><br /><br />D_J嵌入式个人主页，有很多资料！<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://staff.ustc.edu.cn/~wangzhuo/index.html" target="_blank">http://staff.ustc.edu.cn/~wangzhuo/index.html</a><br /><br />renbagshoes的个人主页，有些资料可能对你有用<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://timity2.a77.zgsj.com/" target="_blank">http://timity2.a77.zgsj.com</a><br /><br />老刘软件<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.laoliu-soft.net/" target="_blank">http://www.laoliu-soft.net/</a><br /><br /><br />嵌入式Linux操作系统<br />小型化的嵌入式Linux版本<br />uClinux — 在没有 MMU 的系统上运行的 Linux。目前支持 Motorola 68K、MCF5206 和 MCF5207 ColdFire 微处理器。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.uclinux.org/index.html" target="_blank">http://www.uclinux.org/index.html</a><br /><br />Etlinux — 设计用于在小型工业计算机，尤其是 PC/104 模块上运行的 Linux 的完全分发版<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.prosa.it/etlinux/index.html" target="_blank">http://www.prosa.it/etlinux/index.html</a><br /><br />Tiny Linux ── 可以运行在 386 上的 Linux 分发版。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://tiny.seul.org/en/" target="_blank">http://tiny.seul.org/en/</a><br /><br />ThinLinux ── 面向专用的照相机服务器、X-10 控制器、MP3 播放器和其它类似的嵌入式应用的最小化的 Linux 分发版。<br />www.thinlinux.org<br /><br />LRP(Linux Route Project)<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.linuxrouter.org/" target="_blank">http://www.linuxrouter.org</a><br /><br />Peeweelinux一个小的嵌入式Linux发行版<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://freshmeat.net/projects/peeweelinux" target="_blank">http://freshmeat.net/projects/peeweelinux</a><br /><br />具有实时扩展功能的嵌入式Linux版本<br />RTLinux(Real Time Linux)是新墨西哥州大学计算机系的Victor Yodaiken和Michael Baranov在1996年开始开发的，现由Fsm Labs公司开发，其最新版本是RTLinux Pro1.2版(针对Linux-2.4版本内核)。RTLinux最基本的概念就是“架空”Linux内核，以便让其他的实时进程尽快地被执行。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.fsmlabs.com/" target="_blank">http://www.fsmlabs.com</a><br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.rtlinux.com/" target="_blank">http://www.rtlinux.com</a><br /><br />RTAI(Realtime Application Interface)源于RTLinux，当时由于RTLinux的架构问题，RTLinux内核从2.0版移植到2.2版发生了很大的困难，一直没有完成。在Dipartimento di Ingegneria Aerospaziale Politecnico di Milano工作的Paolo Mantegazza和他的同事们就决定自行做移植的工作，由RTLinux的困境他们认识到，必须解决将来可能面临的兼容性问题，于是RTAI诞生了。它是一个GNU项目，它在Linux内核中加入一系列可以保证硬实时的编程接口，来实现Linux的实时性。RTAI和RTLinux的区别在于它们实现方法不同。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.rtai.org/" target="_blank">http://www.rtai.org</a><br /><br />EL/IX<br /><br />SRT-Linux<br /><br />MontaVista Linux是MontaVista公司发行的具有商业性质的嵌入式实时Linux。它直接修改Linux内核代码中的调度机制和算法，把Linux内核修改成称为Relatively Fully Preemptable Kernel的抢占式内核，以达到一定的实时性，是一种软实时的Linux。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.mvista.com/" target="_blank">http://www.mvista.com</a><br /><br />TimeSys Linux是一个商业化软件，它同时提供了2种实时Linux的方法：一种与MontaVista Linux类似，把Linux的内核改为抢占式内核；另一种采用与RTAI类似的方法，在内核层提供了一套保证实时要求的API接口。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.timesys.com/" target="_blank">http://www.timesys.com</a><br /><br /><br />嵌入式GUI<br /><br />Microwindows由Century Software的CEO Greg Haerr主持开发的一个公开源码(LGPL)的项目。Microwindows致力于为一些小型设备和平台提供现代图形窗口环境。Microwindows支持许多硬件平台，移植性很强。Microwindows的主要目的之一便是运行在嵌入式Linux上，并且提供了基于Win32/X的两套API接口。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.microwindows.org/" target="_blank">http://www.microwindows.org</a><br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://microwindows.org/" target="_blank">http://microwindows.org</a><br /><br />MiniGUI由原清华大学教师魏永明先生开发，是中国人做的得较好的自由软件之一。MiniGUI 是一种面向嵌入式系统或者实时系统的公开源码(LGPL)的图形用户界面支持系统。它主要运行于Linux控制台，实际可以运行在任何一种具有POSIX线程支持的POSIX兼容系统上。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.minigui.org/" target="_blank">http://www.minigui.org</a><br />飞漫软件的MiniGUI项目<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.minigui.com/company/cindex.shtml" target="_blank">http://www.minigui.com/company/cindex.shtml</a><br /><br />Qt/Embedded是著名的QT库开发商Trolltech正在进行的面向嵌入式系统的QT版本。Qt/Embedded对于各种硬件接口到GUI工具包提供了完整的图形栈。Qt/Embedded的API同Qt/X11和Qt/Windows的相同，但它并不是基于X11库的。Qt/Embedded是公开源码(LGPL)项目。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.trolltech.com/" target="_blank">http://www.trolltech.com</a><br /><br />OpenGUI基于一个用汇编实现的x86图形内核，提供了一个快速的、32位的、高层的C/C++图形接口。OpenGUI也是一个公开源码(LGPL)项目。OpenGUI提供了二维绘图原语，消息驱动的API和BMP文件格式支持。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.tutok.sk/fastgl" target="_blank">http://www.tutok.sk/fastgl</a><br /><br />PicoGUI是一个可以工作在包括手持式设备等各种硬件上的小型的、可移植的、基于客户/服务器结构的GUI。同X Window系统一样，它具有客户—服务器结构的灵活性，但又不同于X Window系统，它将字体、BMP文件、控件以及一些应用程序所需要的其它的一些资源直接集成在服务器。虽然减少了系统的灵活性，但在速度上有了很大的提高，并且减小了程序大小。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://picogui.org/" target="_blank">http://picogui.org</a><br /><br />Tiny-X是一个为嵌入式系统而开发的紧缩型的X Window服务器。它由SuSE赞助，由XFree86的核心成员Keith Packard开发。Tiny-X的目标是可以在小内存或几乎无内存的情况下良好运行。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.pps.jussieu.fr/~jch/software/kdrive.html" target="_blank">http://www.pps.jussieu.fr/~jch/software/kdrive.html</a><br /><br />PIXIL提供嵌入式在高级因特网中应用程序的应用。它虽然是为商业化准备的，但它提供GPL协议下的版本，区别是没有技术支持。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.pixil.org/" target="_blank">http://www.pixil.org</a><br /><br />NxZilla - Mozilla on NanoX<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://nxzilla.sourceforge.net/" target="_blank">http://nxzilla.sourceforge.net</a><br /><br />Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. It is used by MPEG playback software, emulators, and many popular games, including the award winning Linux port of "Civilization: Call To Power."<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.libsdl.org/index.php" target="_blank">http://www.libsdl.org/index.php</a><br /><br />GtkFB: GTK+ for the Linux Framebuffer<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.linuxdevices.com/" target="_blank">http://www.linuxdevices.com/</a> articles/AT9024868021.html<br /><br /><br />嵌入式Linux与Java<br />Java 2 Micro Edition(J2ME官方站点)<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.javasoft.com/j2me/" target="_blank">http://www.javasoft.com/j2me/</a><br /><br />waba为小设备提供一个编程平台。它被定义为一种语言，一个虚拟机，一个类文件格式以及功能类的设置。<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://wabasoft.com/products.shtml" target="_blank">http://wabasoft.com/products.shtml</a><br /><br />Kaffe is a clean room implementation of the Java virtual machine, plus the associated class libraries needed to provide a Java runtime environment. The Kaffe virtual machine is free software, licensed under the terms of the GNU General Public License.<br />Kaffe is a great choice as a base for virtual machine education and/or research, or if you need a virtual machine as an integral component of an open source or free software Java distribution.<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.kaffe.org/" target="_blank">http://www.kaffe.org</a><br /><br />Wonka(一个java虚拟机，超小)<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.acunia.com/wonka" target="_blank">http://www.acunia.com/wonka</a><br /><br /><br />选择内核<br /><br />x86<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.kernel.org/" target="_blank">http://www.kernel.org</a><br /><br />ARM<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.arm.linux.org.uk/developer" target="_blank">http://www.arm.linux.org.uk/developer</a><br /><br />PowerPC<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://penguinppc.org/" target="_blank">http://penguinppc.org</a><br /><br />MIPS<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.linux-mips.org/" target="_blank">http://www.linux-mips.org</a><br /><br />SuperH<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://linuxsh.sourceforge.net/" target="_blank">http://linuxsh.sourceforge.net</a><br /><br />M68K<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.linux-m68k.org/" target="_blank">http://www.linux-m68k.org</a><br /><br /><br />其他<br /><img alt="::URL::" hspace="2" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" twffan="done" /><a href="http://www.linuxabc.net/" target="_blank">http://www.linuxabc.net</a><br /><img src ="http://www.cppblog.com/xushaohua/aggbug/13774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xushaohua/" target="_blank">shaohua</a> 2006-10-17 13:13 <a href="http://www.cppblog.com/xushaohua/articles/13774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]走进嵌入式Linux的世界</title><link>http://www.cppblog.com/xushaohua/articles/10531.html</link><dc:creator>shaohua</dc:creator><author>shaohua</author><pubDate>Wed, 26 Jul 2006 07:06:00 GMT</pubDate><guid>http://www.cppblog.com/xushaohua/articles/10531.html</guid><wfw:comment>http://www.cppblog.com/xushaohua/comments/10531.html</wfw:comment><comments>http://www.cppblog.com/xushaohua/articles/10531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xushaohua/comments/commentRss/10531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xushaohua/services/trackbacks/10531.html</trackback:ping><description><![CDATA[
		<blockquote>
				<p align="left">
						<a name="0">
								<span class="atitle2">一、嵌入式系统</span>
						</a>
				</p>
		</blockquote>
		<p>嵌入式系统是以应用为中心，以计算机技术为基础，并且软硬件是可裁剪的，适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。嵌入式系统最典型的特点是与人们的日常生活紧密相关，任何一个普通人都可能拥有各类形形色色运用了嵌入式技术的电子产品，小到MP3、PDA等微型数字化设备，大到信息家电、智能电器、车载GIS，各种新型嵌入式设备在数量上已经远远超过了通用计算机。这也难怪美国著名未来学家尼葛洛庞帝在1999年1月访华时就预言，4~5年后嵌入式智能工具将成为继PC机和Internet之后计算机工业最伟大的发明。</p>
		<p>
				<strong>1.1 历史与现状</strong>
		</p>
		<p>虽然嵌入式系统是近几年才开始真正风靡起来的，但事实上嵌入式这个概念却很早就已经存在了，从上个世纪70年代单片机的出现到今天各种嵌入式微处理器、微控制器的广泛应用，嵌入式系统少说也有了近30年的历史。纵观嵌入式系统的发展历程，大致经历了以下四个阶段：</p>
		<ul>
				<li>
						<p>
								<strong>无操作系统阶段</strong>
						</p>
						<p>嵌入式系统最初的应用是基于单片机的，大多以可编程控制器的形式出现，具有监测、伺服、设备指示等功能，通常应用于各类工业控制和飞机、导弹等武器装备中，一般没有操作系统的支持，只能通过汇编语言对系统进行直接控制，运行结束后再清除内存。这些装置虽然已经初步具备了嵌入式的应用特点，但仅仅只是使用8位的CPU芯片来执行一些单线程的程序，因此严格地说还谈不上"系统"的概念。</p>
						<p>这一阶段嵌入式系统的主要特点是：系统结构和功能相对单一，处理效率较低，存储容量较小，几乎没有用户接口。由于这种嵌入式系统使用简便、价格低廉，因而曾经在工业控制领域中得到了非常广泛的应用，但却无法满足现今对执行效率、存储容量都有较高要求的信息家电等场合的需要。</p>
				</li>
				<li>
						<p>
								<strong>简单操作系统阶段</strong>
						</p>
						<p>20世纪80年代，随着微电子工艺水平的提高，IC制造商开始把嵌入式应用中所需要的微处理器、I/O接口、串行接口以及RAM、ROM等部件统统集成到一片VLSI中，制造出面向I/O设计的微控制器，并一举成为嵌入式系统领域中异军突起的新秀。与此同时，嵌入式系统的程序员也开始基于一些简单的"操作系统"开发嵌入式应用软件，大大缩短了开发周期、提高了开发效率。</p>
						<p>这一阶段嵌入式系统的主要特点是：出现了大量高可靠、低功耗的嵌入式CPU（如Power PC等），各种简单的嵌入式操作系统开始出现并得到迅速发展。此时的嵌入式操作系统虽然还比较简单，但已经初步具有了一定的兼容性和扩展性，内核精巧且效率高，主要用来控制系统负载以及监控应用程序的运行。</p>
				</li>
				<li>
						<p>
								<strong>实时操作系统阶段</strong>
						</p>
						<p>20世纪90年代，在分布控制、柔性制造、数字化通信和信息家电等巨大需求的牵引下，嵌入式系统进一步飞速发展，而面向实时信号处理算法的DSP产品则向着高速度、高精度、低功耗的方向发展。随着硬件实时性要求的提高，嵌入式系统的软件规模也不断扩大，逐渐形成了实时多任务操作系统（RTOS），并开始成为嵌入式系统的主流。</p>
						<p>这一阶段嵌入式系统的主要特点是：操作系统的实时性得到了很大改善，已经能够运行在各种不同类型的微处理器上，具有高度的模块化和扩展性。此时的嵌入式操作系统已经具备了文件和目录管理、设备管理、多任务、网络、图形用户界面（GUI）等功能，并提供了大量的应用程序接口（API），从而使得应用软件的开发变得更加简单。</p>
				</li>
				<li>
						<p>
								<strong>面向Internet阶段</strong>
						</p>
						<p>21世纪无疑将是一个网络的时代，将嵌入式系统应用到各种网络环境中去的呼声自然也越来越高。目前大多数嵌入式系统还孤立于Internet之外，随着Internet的进一步发展，以及Internet技术与信息家电、工业控制技术等的结合日益紧密，嵌入式设备与Internet的结合才是嵌入式技术的真正未来。</p>
						<p>信息时代和数字时代的到来，为嵌入式系统的发展带来了巨大的机遇，同时也对嵌入式系统厂商提出了新的挑战。目前，嵌入式技术与Internet技术的结合正在推动着嵌入式技术的飞速发展，嵌入式系统的研究和应用产生了如下新的显著变化：</p>
						<ol>
								<li>新的微处理器层出不穷，嵌入式操作系统自身结构的设计更加便于移植，能够在短时间内支持更多的微处理器。 
</li>
								<li>嵌入式系统的开发成了一项系统工程，开发厂商不仅要提供嵌入式软硬件系统本身，同时还要提供强大的硬件开发工具和软件支持包。 
</li>
								<li>通用计算机上使用的新技术、新观念开始逐步移植到嵌入式系统中，如嵌入式数据库、移动代理、实时CORBA等，嵌入式软件平台得到进一步完善。 
</li>
								<li>各类嵌入式Linux操作系统迅速发展，由于具有源代码开放、系统内核小、执行效率高、网络结构完整等特点，很适合信息家电等嵌入式系统的需要，目前已经形成了能与Windows CE、Palm OS等嵌入式操作系统进行有力竞争的局面。 
</li>
								<li>网络化、信息化的要求随着Internet技术的成熟和带宽的提高而日益突出，以往功能单一的设备如电话、手机、冰箱、微波炉等功能不再单一，结构变得更加复杂，网络互联成为必然趋势。 
</li>
								<li>精简系统内核，优化关键算法，降低功耗和软硬件成本。 
</li>
								<li>提供更加友好的多媒体人机交互界面。 </li>
						</ol>
				</li>
		</ul>
		<p>
				<strong>1.2 体系结构</strong>
		</p>
		<p>根据国际电气和电子工程师协会（IEEE）的定义，嵌入式系统是"控制、监视或者辅助设备、机器和车间运行的装置"（devices used to control, monitor, or assist the operation of equipment, machinery or plants）。一般而言，整个嵌入式系统的体系结构可以分成四个部分：嵌入式处理器、嵌入式外围设备、嵌入式操作系统和嵌入式应用软件，如图1所示。</p>
		<p align="center">
				<img alt="" src="http://www-900.ibm.com/developerWorks/cn/linux/l-embed/part1/image001.gif" />
				<br />图1 嵌入式系统的组成</p>
		<ul>
				<li>
						<p>
								<strong>嵌入式处理器</strong>
						</p>
						<p>嵌入式系统的核心是各种类型的嵌入式处理器，嵌入式处理器与通用处理器最大的不同点在于，嵌入式CPU大多工作在为特定用户群所专门设计的系统中，它将通用CPU中许多由板卡完成的任务集成到芯片内部，从而有利于嵌入式系统在设计时趋于小型化，同时还具有很高的效率和可靠性。</p>
						<p>嵌入式处理器的体系结构经历了从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）。</p>
						<p>目前几乎每个半导体制造商都生产嵌入式处理器，并且越来越多的公司开始拥有自主的处理器设计部门，据不完全统计，全世界嵌入式处理器已经超过1000多种，流行的体系结构有30多个系列，其中以ARM、PowerPC、MC 68000、MIPS等使用得最为广泛。</p>
				</li>
				<li>
						<p>
								<strong>嵌入式外围设备</strong>
						</p>
						<p>在嵌入系统硬件系统中，除了中心控制部件（MCU、DSP、EMPU、SOC）以外，用于完成存储、通信、调试、显示等辅助功能的其他部件，事实上都可以算作嵌入式外围设备。目前常用的嵌入式外围设备按功能可以分为存储设备、通信设备和显示设备三类。</p>
						<p>存储设备主要用于各类数据的存储，常用的有静态易失型存储器（RAM、SRAM）、动态存储器（DRAM）和非易失型存储器（ROM、EPROM、EEPROM、FLASH）三种，其中FLASH凭借其可擦写次数多、存储速度快、存储容量大、价格便宜等优点，在嵌入式领域内得到了广泛应用。</p>
						<p>目前存在的绝大多数通信设备都可以直接在嵌入式系统中应用，包括RS-232接口（串行通信接口）、SPI（串行外围设备接口）、IrDA（红外线接口）、I2C（现场总线）、USB（通用串行总线接口）、Ethernet（以太网接口）等。</p>
						<p>由于嵌入式应用场合的特殊性，通常使用的是阴极射线管（CRT）、液晶显示器（LCD）和触摸板（Touch Panel）等外围显示设备。</p>
				</li>
				<li>
						<p>
								<strong>嵌入式操作系统</strong>
						</p>
						<p>为了使嵌入式系统的开发更加方便和快捷，需要有专门负责管理存储器分配、中断处理、任务调度等功能的软件模块，这就是嵌入式操作系统。嵌入式操作系统是用来支持嵌入式应用的系统软件，是嵌入式系统极为重要的组成部分，通常包括与硬件相关的底层驱动程序、系统内核、设备驱动接口、通信协议、图形用户界面（GUI）等。嵌入式操作系统具有通用操作系统的基本特点，如能够有效管理复杂的系统资源，能够对硬件进行抽象，能够提供库函数、驱动程序、开发工具集等。但与通用操作系统相比较，嵌入式操作系统在系统实时性、硬件依赖性、软件固化性以及应用专用性等方面，具有更加鲜明的特点。</p>
						<p>嵌入式操作系统根据应用场合可以分为两大类：一类是面向消费电子产品的非实时系统，这类设备包括个人数字助理（PDA）、移动电话、机顶盒（STB）等；另一类则是面向控制、通信、医疗等领域的实时操作系统，如WindRiver公司的VxWorks、QNX系统软件公司的QNX等。实时系统（Real Time System）是一种能够在指定或者确定时间内完成系统功能，并且对外部和内部事件在同步或者异步时间内能做出及时响应的系统。在实时系统中，操作的正确性不仅依赖于逻辑设计的正确程度，而且与这些操作进行的时间有关，也就是说，实时系统对逻辑和时序的要求非常严格，如果逻辑和时序控制出现偏差将会产生严重后果。</p>
						<p>实时系统主要通过三个性能指标来衡量系统的实时性，即响应时间（Response Time）、生存时间（Survival Time）和吞吐量（Throughput）：</p>
						<ul>
								<li>
										<strong>响应时间</strong>　　是实时系统从识别出一个外部事件到做出响应的时间； 
</li>
								<li>
										<strong>生存时间</strong>　是数据的有效等待时间，数据只有在这段时间内才是有效的； 
</li>
								<li>
										<strong>吞吐量</strong>　　　是在给定的时间内系统能够处理的事件总数，吞吐量通常比平均响应时间的倒数要小一点。 </li>
						</ul>
						<p>实时系统根据响应时间可以分为弱实时系统、一般实时系统和强实时系统三种。弱实时系统在设计时的宗旨是使各个任务运行得越快越好，但没有严格限定某一任务必须在多长时间内完成，弱实时系统更多关注的是程序运行结果的正确与否，以及系统安全性能等其他方面，对任务执行时间的要求相对来讲较为宽松，一般响应时间可以是数十秒或者更长。一般实时系统是弱实时系统和强实时系统的一种折衷，它的响应时间可以在秒的数量级上，广泛应用于消费电子设备中。强实时系统则要求各个任务不仅要保证执行过程和结果的正确性，同时还要保证在限定的时间内完成任务，响应时间通常要求在毫秒甚至微秒的数量级上，这对涉及到医疗、安全、军事的软硬件系统来说是至关重要的。</p>
						<p>时限（deadline）是实时系统中的一个重要概念，指的是对任务截止时间的要求，根据时限对系统性能的影响程度，实时系统又可以分为软实时系统（soft real-time-system）和硬实时系统（hard real-time-system）。软实时指的是虽然对系统响应时间有所限定，但如果系统响应时间不能满足要求，并不会导致系统产生致命的错误或者崩溃；硬实时则指的是对系统响应时间有严格的限定，如果系统响应时间不能满足要求，就会引起系统产生致命的错误或者崩溃。如果一个任务在时限到达之时尚未完成，对软实时系统来说还是可以容忍的，最多只会降低系统性能，但对硬实时系统来说则是无法接受的，因为这样带来的后果根本无法预测，甚至可能是灾难性的。在目前实际运用的实时系统中，通常允许软硬两种实时性同时存在，其中一些事件没有时限要求，另外一些事件的时限要求是软实时的，而对系统产生关键影响的那些事件的时限要求则是硬实时的。</p>
				</li>
				<li>
						<p>
								<strong>嵌入式应用软件</strong>
						</p>
						<p>嵌入式应用软件是针对特定应用领域，基于某一固定的硬件平台，用来达到用户预期目标的计算机软件，由于用户任务可能有时间和精度上的要求，因此有些嵌入式应用软件需要特定嵌入式操作系统的支持。嵌入式应用软件和普通应用软件有一定的区别，它不仅要求其准确性、安全性和稳定性等方面能够满足实际应用的需要，而且还要尽可能地进行优化，以减少对系统资源的消耗，降低硬件成本。</p>
				</li>
		</ul>
		<p>
				<strong>1.3 关键问题</strong>
		</p>
		<p>嵌入式系统是将先进的计算机技术、半导体技术以及电子技术与特定行业的具体应用相结合的产物，因此必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统，嵌入式系统的开发充满了竞争、机遇与创新，需要解决好如下一些关键问题：</p>
		<ol>
				<li>
						<strong>内核精巧</strong>　　嵌入式系统的应用领域一般都是小型电子装置，系统资源相对有限，因此对内核的要求相当高，较之传统的操作系统来讲要小得多，例如ENEA公司推出的OSE分布式嵌入式系统，整个内核只有5KB。 
</li>
				<li>
						<strong>面向应用</strong>　　嵌入式系统通常是面向用户、面向产品、面向特定应用的。嵌入式系统中的CPU大多工作在为特定用户群定制的环境中，具有低耗、体积小、集成度高等特点，在进行软硬件设计时必须突出效率、去除冗余，针对用户的具体需求对系统进行合理的配置，方能达到理想的性能。 
</li>
				<li>
						<strong>系统精简</strong>　　嵌入式系统中的系统软件和应用软件通常没有明显的区别，不要求其功能及实现上过于复杂，这样一方面有利于控制系统成本，另一方面也有利于保证系统安全。 
</li>
				<li>
						<strong>性能优化</strong>　　嵌入式系统通常都要求有一定的实时性保障，为了提高执行速度和系统性能，嵌入式系统中的软件一般都固化在存储芯片或者处理器的内部存储器件当中，而不是存贮在磁盘等外部载体中。由于嵌入式系统的运算速度和存储容量存在一定程度上的限制，而且大部分系统都必须有较高的实时性保证，因此对软件质量（特别是可靠性方面）有着较高的要求。 
</li>
				<li>
						<strong>专业开发</strong>　　嵌入式系统本身并不具备自主开发能力，用户不能直接在其上进行二次开发。当系统完成之后，用户如果需要修改其中某个程序的功能，必须借助一套完整的开发工具和环境。嵌入式系统中专用的开发工具和环境通常是基于通用计算机上的软硬件设备，以及各种逻辑分析仪、混合信号示波器等。 </li>
		</ol>
		<p>
				<a name="1">
						<span class="atitle2">二、嵌入式Linux</span>
				</a>
		</p>
		<p>Linux从1991年问世到现在，短短的十几年时间已经发展成为功能强大、设计完善的操作系统之一，不仅可以与各种传统的商业操作系统分庭抗争，在新兴的嵌入式操作系统领域内也获得了飞速发展。嵌入式Linux（Embedded Linux）是指对标准Linux经过小型化裁剪处理之后，能够固化在容量只有几K或者几M字节的存储器芯片或者单片机中，适合于特定嵌入式应用场合的专用Linux操作系统。</p>
		<p>
				<strong>2.1 优势</strong>
		</p>
		<p>嵌入式Linux的开发和研究是操作系统领域中的一个热点，目前已经开发成功的嵌入式系统中，大约有一半使用的是Linux。Linux之所以能在嵌入式系统市场上取得如此辉煌的成果，与其自身的优良特性是分不开的。</p>
		<ul>
				<li>
						<p>
								<strong>广泛的硬件支持</strong>
						</p>
						<p>Linux能够支持x86、ARM、MIPS、ALPHA、PowerPC等多种体系结构，目前已经成功移植到数十种硬件平台，几乎能够运行在所有流行的CPU上。Linux有着异常丰富的驱动程序资源，支持各种主流硬件设备和最新硬件技术，甚至可以在没有存储管理单元（MMU）的处理器上运行，这些都进一步促进了Linux在嵌入式系统中的应用。</p>
				</li>
				<li>
						<p>
								<strong>内核高效稳定</strong>
						</p>
						<p>Linux内核的高效和稳定已经在各个领域内得到了大量事实的验证，Linux的内核设计非常精巧，分成进程调度、内存管理、进程间通信、虚拟文件系统和网络接口五大部分，其独特的模块机制可以根据用户的需要，实时地将某些模块插入到内核或从内核中移走。这些特性使得Linux系统内核可以裁剪得非常小巧，很适合于嵌入式系统的需要。</p>
				</li>
				<li>
						<p>
								<strong>开放源码，软件丰富</strong>
						</p>
						<p>Linux是开放源代码的自由操作系统，它为用户提供了最大限度的自由度，由于嵌入式系统千差万别，往往需要针对具体的应用进行修改和优化，因而获得源代码就变得至关重要了。Linux的软件资源十分丰富，每一种通用程序在Linux上几乎都可以找到，并且数量还在不断增加。在Linux上开发嵌入式应用软件一般不用从头做起，而是可以选择一个类似的自由软件做为原型，在其上进行二次开发。</p>
				</li>
				<li>
						<p>
								<strong>优秀的开发工具</strong>
						</p>
						<p>开发嵌入式系统的关键是需要有一套完善的开发和调试工具。传统的嵌入式开发调试工具是在线仿真器（In-Circuit Emulator，ICE），它通过取代目标板的微处理器，给目标程序提供一个完整的仿真环境，从而使开发者能够非常清楚地了解到程序在目标板上的工作状态，便于监视和调试程序。在线仿真器的价格非常昂贵，而且只适合做非常底层的调试，如果使用的是嵌入式Linux，一旦软硬件能够支持正常的串口功能时，即使不用在线仿真器也可以很好地进行开发和调试工作，从而节省了一笔不小的开发费用。嵌入式Linux为开发者提供了一套完整的工具链（Tool Chain），它利用GNU的gcc做编译器，用gdb、kgdb、xgdb做调试工具，能够很方便地实现从操作系统到应用软件各个级别的调试。</p>
				</li>
				<li>
						<p>
								<strong>完善的网络通信和文件管理机制</strong>
						</p>
						<p>Linux至诞生之日起就与Internet密不可分，支持所有标准的Internet网络协议，并且很容易移植到嵌入式系统当中。此外，Linux还支持ext2、fat16、fat32、romfs等文件系统，这些都为开发嵌入式系统应用打下了很好的基础。</p>
				</li>
		</ul>
		<p>
				<strong>2.2 挑战</strong>
		</p>
		<p>目前，嵌入式Linux系统的研发热潮正在蓬勃兴起，并且占据了很大的市场份额，除了一些传统的Linux公司（如RedHat、MontaVista等）正在从事嵌入式Linux的开发和应用之外，IBM、Intel、Motorola等著名企业也开始进行嵌入式Linux的研究。虽然前景一片灿烂，但就目前而言，嵌入式Linux的研究成果与市场的真正要求仍有一段差距，要开发出真正成熟的嵌入式Linux系统，还需要从以下几个方面做出努力。</p>
		<ul>
				<li>
						<p>
								<strong>提高系统实时性</strong>
						</p>
						<p>Linux虽然已经被成功地应用到了PDA、移动电话、车载电视、机顶盒、网络微波炉等各种嵌入式设备上，但在医疗、航空、交通、工业控制等对实时性要求非常严格的场合中还无法直接应用，原因在于现有的Linux是一个通用的操作系统，虽然它也采用了许多技术来加快系统的运行和响应速度，并且符合POSIX 1003.1b标准，但从本质上来说并不是一个嵌入式实时操作系统。Linux的内核调度策略基本上是沿用UNIX系统的，将它直接应用于嵌入式实时环境会有许多缺陷，如在运行内核线程时中断被关闭，分时调度策略存在时间上的不确定性，以及缺乏高精度的计时器等等。正因如此，利用Linux作为底层操作系统，在其上进行实时化改造，从而构建出一个具有实时处理能力的嵌入式系统，是现在日益流行的解决方案。</p>
				</li>
				<li>
						<p>
								<strong>改善内核结构</strong>
						</p>
						<p>Linux内核采用的是整体式结构（Monolithic），整个内核是一个单独的、非常大的程序，这样虽然能够使系统的各个部分直接沟通，有效地缩短任务之间的切换时间，提高系统响应速度，但与嵌入式系统存储容量小、资源有限的特点不相符合。嵌入式系统经常采用的是另一种称为微内核（Microkernel）的体系结构，即内核本身只提供一些最基本的操作系统功能，如任务调度、内存管理、中断处理等，而类似于文件系统和网络协议等附加功能则运行在用户空间中，并且可以根据实际需要进行取舍。Microkernel的执行效率虽然比不上Monolithic，但却大大减小了内核的体积，便于维护和移植，更能满足嵌入式系统的要求。可以考虑将Linux内核部分改造成Microkernel，使Linux在具有很高性能的同时，又能满足嵌入式系统体积小的要求。</p>
				</li>
				<li>
						<p>
								<strong>完善集成开发平台</strong>
						</p>
						<p>引入嵌入式Linux系统集成开发平台，是嵌入式Linux进一步发展和应用的内在要求。传统上的嵌入式系统都是面向具体应用场合的，软件和硬件之间必须紧密配合，但随着嵌入式系统规模的不断扩大和应用领域的不断扩展，嵌入式操作系统的出现就成了一种必然，因为只有这样才能促成嵌入式系统朝层次化和模块化的方向发展。很显然，嵌入式集成开发平台也是符合上述发展趋势的，一个优秀的嵌入式集成开发环境能够提供比较完备的仿真功能，可以实现嵌入式应用软件和嵌入式硬件的同步开发，从而摆脱了"嵌入式应用软件的开发依赖于嵌入式硬件的开发，并且以嵌入式硬件的开发为前提"的不利局面。一个完整的嵌入式集成开发平台通常包括编译器、连接器、调试器、跟踪器、优化器和集成用户界面，目前Linux在基于图形界面的特定系统定制平台的研究上，与Windows CE等商业嵌入式操作系统相比还有很大差距，整体集成开发环境有待提高和完善。</p>
				</li>
		</ul>
		<p>
				<a name="2">
						<span class="atitle2">三、关键技术</span>
				</a>
		</p>
		<p>嵌入式系统是一种根据特定用途所专门开发的系统，它只完成预期要完成的功能，因此其开发过程和开发环境同传统的软件开发相比有着显著的不同。</p>
		<p>
				<strong>3.1 开发流程</strong>
		</p>
		<p>在嵌入式系统的应用开发中，整个系统的开发过程如图2所示：</p>
		<p align="center">
				<img alt="" src="http://www-900.ibm.com/developerWorks/cn/linux/l-embed/part1/image002.gif" />
				<br />图2 嵌入式系统的开发流程</p>
		<p>嵌入式系统发展到今天，对应于各种微处理器的硬件平台一般都是通用的、固定的、成熟的，这就大大减少了由硬件系统引入错误的机会。此外，由于嵌入式操作系统屏蔽了底层硬件的复杂性，使得开发者通过操作系统提供的API函数就可以完成大部分工作，因此大大简化了开发过程，提高了系统的稳定性。嵌入式系统的开发者现在已经从反复进行硬件平台设计的过程中解脱出来，从而可以将主要精力放在满足特定的需求上。</p>
		<p>嵌入式系统通常是一个资源受限的系统，因此直接在嵌入式系统的硬件平台上编写软件比较困难，有时候甚至是不可能的。目前一般采用的解决办法是首先在通用计算机上编写程序，然后通过交叉编译生成目标平台上可以运行的二进制代码格式，最后再下载到目标平台上的特定位置上运行。</p>
		<p>需要交叉开发环境（Cross Development Environment）的支持是嵌入式应用软件开发时的一个显著特点，交叉开发环境是指编译、链接和调试嵌入式应用软件的环境，它与运行嵌入式应用软件的环境有所不同，通常采用宿主机／目标机模式，如图3所示。</p>
		<p align="center">
				<img alt="" src="http://www-900.ibm.com/developerWorks/cn/linux/l-embed/part1/image003.jpg" />
				<br />图3 交叉开发环境</p>
		<p>宿主机（Host）是一台通用计算机（如PC机或者工作站），它通过串口或者以太网接口与目标机通信。宿主机的软硬件资源比较丰富，不但包括功能强大的操作系统（如Windows和Linux），而且还有各种各样优秀的开发工具（如WindRiver的Tornado、Microsoft的Embedded Visual C++等），能够大大提高嵌入式应用软件的开发速度和效率。</p>
		<p>目标机（Target）一般在嵌入式应用软件开发期间使用，用来区别与嵌入式系统通信的宿主机，它可以是嵌入式应用软件的实际运行环境，也可以是能够替代实际运行环境的仿真系统，但软硬件资源通常都比较有限。嵌入式系统的交叉开发环境一般包括交叉编译器、交叉调试器和系统仿真器，其中交叉编译器用于在宿主机上生成能在目标机上运行的代码，而交叉调试器和系统仿真器则用于在宿主机与目标机间完成嵌入式软件的调试。在采用宿主机／目标机模式开发嵌入式应用软件时，首先利用宿主机上丰富的资源和良好的开发环境开发和仿真调试目标机上的软件，然后通过串口或者以网络将交叉编译生成的目标代码传输并装载到目标机上，并在监控程序或者操作系统的支持下利用交叉调试器进行分析和调试，最后目标机在特定环境下脱离宿主机单独运行。</p>
		<p>建立交叉开发环境是进行嵌入式软件开发的第一步，目前常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链、目前已经能够支持x86、ARM、MIPS、PowerPC等多种处理器。商业的交叉开发环境则主要有Metrowerks CodeWarrior、ARM Software Development Toolkit、SDS Cross compiler、WindRiver Tornado、Microsoft Embedded Visual C++等。</p>
		<p>
				<strong>3.2 交叉编译和链接</strong>
		</p>
		<p>在完成嵌入式软件的编码之后，需要进行编译和链接以生成可执行代码，由于开发过程大多是在使用Intel公司x86系列CPU的通用计算机上进行的，而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器，这就要求在建立好的交叉开发环境中进行交叉编译和链接。</p>
		<p>交叉编译器和交叉链接器是能够在宿主机上运行，并且能够生成在目标机上直接运行的二进制代码的编译器和链接器。例如在基于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。</p>
		<p>嵌入式系统在链接过程中通常都要求使用较小的函数库，以便最后产生的可执行代码能够尽可能地小，因此实际运用时一般使用经过特殊处理的函数库。对于嵌入式Linux系统来讲，功能越来越强、体积越来越大的C语言函数库glibc和数学函数库libm已经很难满足实际的需要，因此需要采用它们的精化版本uClibc、uClibm和newlib等。</p>
		<p>目前嵌入式的集成开发环境都支持交叉编译和交叉链接，如WindRiver Tornado和GNU工具链等，编写好的嵌入式软件经过交叉编译和交叉链接后通常会生成两种类型的可执行文件：用于调试的可执行文件和用于固化的可执行文件。</p>
		<p>
				<strong>3.3 交叉调试</strong>
		</p>
		<p>嵌入式软件经过编译和链接后即进入调试阶段，调试是软件开发过程中必不可少的一个环节，嵌入式软件开发过程中的交叉调试与通用软件开发过程中的调试方式有所差别。在通用软件开发中，调试器与被调试的程序往往运行在同一台计算机上，调试器是一个单独运行着的进程，它通过操作系统提供的调试接口来控制被调试的进程。而在嵌入式软件开发中，调试时采用的是在宿主机和目标机之间进行的交叉调试，调试器仍然运行在宿主机的通用操作系统之上，但被调试的进程却是运行在基于特定硬件平台的嵌入式操作系统中，调试器和被调试进程通过串口或者网络进行通信，调试器可以控制、访问被调试进程，读取被调试进程的当前状态，并能够改变被调试进程的运行状态。</p>
		<p>交叉调试（Cross Debug）又常常被称为远程调试（Remote Debug），是一种允许调试器以某种方式控制目标机上被调试进程的运行方式，并具有查看和修改目标机上内存单元、寄存器以及被调试进程中变量值等各种调试功能的调试方式。一般而言，远程调试过程的结构如图4所示。</p>
		<p align="center">
				<img alt="" src="http://www-900.ibm.com/developerWorks/cn/linux/l-embed/part1/image004.jpg" />
				<br />图4远程调试结构</p>
		<p>嵌入式系统的交叉调试有多种方法，可以被细分成不同的层次，但一般都具有如下一些典型特点：</p>
		<ol>
				<li>调试器和被调试进程运行在不同的机器上，调试器运行在PC或者工作站上（宿主机），而被调试的进程则运行在各种专业调试板上（目标机）。 
</li>
				<li>调试器通过某种通信方式与被调试进程建立联系，如串口、并口、网络、DBM、JTAG或者专用的通信方式。 
</li>
				<li>在目标机上一般会具备某种形式的调试代理，它负责与调试器共同配合完成对目标机上运行着的进程的调试。这种调试代理可能是某些支持调试功能的硬件设备（如DBI 2000），也可能是某些专门的调试软件（如gdbserver）。 
</li>
				<li>目标机可能是某种形式的系统仿真器，通过在宿主机上运行目标机的仿真软件，整个调试过程可以在一台计算机上运行。此时物理上虽然只有一台计算机，但逻辑上仍然存在着宿主机和目标机的区别。 </li>
		</ol>
		<p>在嵌入式软件开发过程中的调试方式有很多种，应根据实际的开发要求和条件进行选择。就调试方法而言，嵌入式系统的交叉调试可以分为硬件调试和软件调试两种，前者使用仿真调试器协助调试过程，而后者则使用软件调试器完成调试过程。</p>
		<ul>
				<li>
						<p>
								<strong>硬件调试</strong>
						</p>
						<p>相对于软件调试而言，使用硬件调试器可以获得更强大的调试功能和更优秀的调试性能。硬件调试器的基本原理是通过仿真硬件的执行过程，让开发者在调试时可以随时了解到系统的当前执行情况。目前嵌入式系统开发中最常用到的硬件调试器是ROM Monitor、ROM Emulator、In-Circuit Emulator和In-Circuit Debugger。</p>
						<p>采用ROM Monitor方式进行交叉调试需要在宿主机上运行调试器，在目标机上运行ROM监视器（ROM Monitor）和被调试程序，宿主机通过调试器与目标机上的ROM监视器建立通信连接，它们之间的通信遵循远程调试协议。ROM监视器可以是一段运行在目标机ROM上的可执行程序，也可以是一个专门的硬件调试设备，它负责监控目标机上被调试程序的运行情况，能够与宿主机端的调试器一同完成对应用程序的调试。在使用这种调试方式时，被调试程序首先通过ROM监视器下载到目标机，然后在ROM监视器的监控下完成调试，目前使用的绝大部分ROM监视器能够完成设置断点、单步执行、查看寄存器、修改内存空间等各项调试功能。</p>
						<p>采用ROM Emulator方式进行交叉调试时需要使用ROM仿真器，它通常被插入到目标机上的ROM插槽中，专门用于仿真目标机上的ROM芯片。在使用这种调试方式时，被调试程序首先下载到ROM仿真器中，它等效于下载到目标机的ROM芯片上，然后在ROM仿真器中完成对目标程序的调试。ROM Emulator调试方式通过使用一个ROM仿真器，虽然避免了每次修改程序后都必须重新烧写到目标机ROM中这一费时费力的操作，但由于ROM仿真器本身比较昂贵，功能相对来讲又比较单一，因此只适应于某些特定场合。</p>
						<p>采用In-Circuit Emulator（ICE）方式进行交叉调试时需要使用在线仿真器，它是仿照目标机上的CPU而专门设计的硬件，可以完全仿真处理器芯片的行为，并且提供了非常丰富的调试功能。在使用在线仿真器进行调试的过程中，可以按顺序单步执行，也可以倒退执行，还可以实时查看所有需要的数据，从而给调试过程带来了很多的便利。嵌入式系统应用的一个显著特点是与现实世界中的硬件直接相关，存在各种异变和事先未知的变化，从而给微处理器的指令执行带来各种不确定因素，这种不确定性在目前情况下只有通过在线仿真器才有可能发现，因此尽管在线仿真器的价格非常昂贵，但仍然得到了非常广泛的应用。</p>
						<p>采用In-Circuit Debugger（ICD）方式进行交叉调试时需要使用在线调试器。由于ICE的价格非常昂贵，并且每种CPU都需要一种与之对应的ICE，使得开发成本非常高，一个比较好的解决办法是让CPU直接在其内部实现调试功能，并通过在开发板上引出的调试端口，发送调试命令和接收调试信息，完成调试过程。目前Motorola公司提供的开发板上使用的是DBM调试端口，而ARM公司提供的开发板上使用的则是JTAG调试端口，使用合适的软件工具与这些调试端口进行连接，可以获得与ICE类似的调试效果。</p>
				</li>
				<li>
						<p>
								<strong>软件调试</strong>
						</p>
						<p>软件调试通常要在不同的层次上进行，有时可能需要对嵌入式操作系统的内核进行调试，而有时可能仅仅只需要调试嵌入式应用程序就可以了。在嵌入式系统的整个开发过程中，不同层次上的软件调试需要使用不同的调试方法。</p>
						<p>嵌入式操作系统的内核调试相对来讲比较困难，这是因为在内核中不便于增加一个调试器程序，而只能通过远程调试的方法，通过串口和操作系统内置的"调试桩"（debug stub）进行通信，共同完成调试过程。调试桩可以看成是一个调试服务器，它通过操作系统获得一些必要的调试信息，并且负责处理宿主机发送来的调试命令。具体到嵌入式Linux系统内核，调试时可以先在Linux内核中设置一个调试桩，用作调试过程中和宿主机之间的通信服务器，然后就可以在宿主机中通过调试器的串口与调试桩进行通信，并通过调试器控制目标机上Linux内核的运行。</p>
						<p>嵌入式应用软件的调试可以使用本地调试和远程调试两种方法，相对于操作系统的调试而言，这两种方式都比较简单。如果采用的是本地调试，首先要将所需的调试器移植到目标系统中，然后就可以直接在目标机上运行调试器来调试应用程序了；如果采用的是远程调试，则需要移植一个调试服务器到目标系统中，并通过它与宿主机上的调试器共同完成应用程序的调试。在嵌入式Linux系统的开发中，远程调试时目标机上使用的调试服务器通常是gdbserver，而宿主机上使用的调试器则是gdb，两者相互配合共同完成调试过程。</p>
				</li>
		</ul>
		<p>
				<strong>3.4 系统测试</strong>
		</p>
		<p>嵌入式系统的硬件一般采用专门的测试仪器进行测试，而软件则需要有相关的测试技术和测试工具的支持，并要采用特定的测试策略。测试技术指的是软件测试的专门途径，以及能够更加有效地运用这些途径的特定方法。在嵌入式软件测试中，常常要在基于目标机的测试和基于宿主机的测试之间做出折衷，基于目标机的测试需要消耗较多的时间和经费，而基于宿主机的测试虽然代价较小，但毕竟是在仿真环境中进行的，因此难以完全反映软件运行时的实际情况。这两种环境下的测试可以发现不同的软件缺陷，关键是要对目标机环境和宿主机环境下的测试内容进行合理取舍。</p>
		<p>测试工具指的是那些能够用来辅助测试的工具，测试工具主要用来支持测试人员的测试工作，本身不能直接用来进行测试，测试工具一般都是通用工具，测试人员应该根据实际情况对它们进行适当的调整。嵌入式软件测试中经常用到测试工具主要有内存分析工具、性能分析工具、覆盖分析工具、缺陷跟踪工具等。</p>
		<ul>
				<li>
						<p>
								<strong>内存分析工具</strong>
						</p>
						<p>嵌入式系统的内存资源通常是受限的，内存分析工具可以用来处理在进行动态内存分配时产生的缺陷。当动态分配的内存被错误地引用时，产生的错误通常难以再现，可出现的失效难以追踪，使用内存分析工具可以很好地检测出这类缺陷。目前常用的内存分析工具有软件和硬件两种，基于软件的内存分析工具可能会对代码的执行性能带来很大影响，从而影响系统的实时性；基于硬件的内存分析工具价格昂贵，并且只能在特定的环境中使用。</p>
				</li>
				<li>
						<p>
								<strong>性能分析工具</strong>
						</p>
						<p>嵌入式系统的性能通常是一个非常关键的因素，开发人员一般需要对系统的某些关键代码进行优化来改进性能，而首先遇到的问题自然就是确定需要对哪些代码进行优化。性能分析工具可以为开发人员提供有关的数据，说明执行时间是如何消耗的，是什么时候消耗的，以及每个进程所使用的时间。这些数据可以帮助确定哪些进程消耗了过多的执行时间，从而可以决定如何优化软件，以获得更好的时间性能。此外，性能分析工具还可以引导开发人员发现在系统调用中存在的错误以及程序结构上的缺陷。</p>
				</li>
				<li>
						<p>
								<strong>覆盖分析工具</strong>
						</p>
						<p>在进行白盒测试时，可以使用代码覆盖分析工具追踪哪些代码被执行过，分析过程一般通过插桩来完成，插桩可以是在测试环境中嵌入硬件，也可以是在可执行代码中加入软件，或者是两者的结合。开发人员通过对分析结果进行总结，可以确定哪些代码被执行过，哪些代码被遗漏了。目前常用的覆盖分析工具一般都会提供有关功能覆盖、分支覆盖、条件覆盖等信息。</p>
				</li>
		</ul>
		<p>
				<a name="3">
						<span class="atitle2">四、小结</span>
				</a>
		</p>
		<p>现今的嵌入式系统在网络化潮流的推动下，已经逐渐摆脱过去那种小巧而简单的模式，开始进入复杂度高、功能强大的阶段，吸引了许多程序设计人员和硬件开发人员的视线。本文讨论了嵌入式Linux系统的基本知识、开发流程、开发工具、调试工具、测试工具等，并指出了嵌入式系统的开发与一般通用计算机软件开发的不同点及应该注意的事项，这些都是今后在进行嵌入式Linux系统开发时必须具备的基础知识。</p>
<img src ="http://www.cppblog.com/xushaohua/aggbug/10531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xushaohua/" target="_blank">shaohua</a> 2006-07-26 15:06 <a href="http://www.cppblog.com/xushaohua/articles/10531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>