当前位置导航:炫浪网>>网络学院>>操作系统>>Linux教程

嵌入式系统以及如何构造一个嵌入式系统


  大多数的Linux系统运行于PC平台,但是,Linux也可在嵌入式系统中可靠的工作。此篇论文讲述了嵌入式系统的概况,以及论证了有关Linux应用于商业嵌入式系统的问题。
  
  嵌入式系统 ---- 比摩西还老
  那些用以控制设备的计算机,或叫嵌入式系统,差不多同计算机本身一样早地出现在我们的周围。
  
  在通信领域中,这些嵌入式系统早在20世纪60年代后期就被用来控制电话的电子式机械交换并被称为“存储程控控制“系统“计算机”一词在那时尚不常见;所谓的存储程序是指那些放有程序和路由信息的内存。存储这些控制逻辑而不是用硬件来实现是在观念上的一种真正突破,现今,我们早认为这种工作机理是理所当然的了。
  
  为适应每一个应用,这些计算机是被定做出来的(简言之,这些计算机是面向应用的).按今天的标准来看,他们有着奇怪的专用指令以及与主要计算引擎集成在一起的I/O设备,就像一批突变异种者.
  
  微处理器通过提供一个小巧低价的并可以在大系统中像搭积木那样使用的CPU引擎改变了这一情况;它利用一基于被一条总线挂接在一起的不同外设所构建的严格的硬件体系结构并提供一个可以简化编程的通用目的编程模型.
  
  同硬件一起,软件也得到了发展.最初,只有一些简单的开发工具可供用以创建和调试软件.各工程项目的运行软件通常以信手涂鸦的方式编出来.由于编译器经常有很多错误而且也缺乏象样的调试器,这些软件差不多总是用汇编语言或宏语言来写.采用软件构建块和标准库的编程思想直到20世纪70年代中期才流行起来.
  
  用于嵌入式系统的与"搁架"无关的操作系统(OS)在20世纪70年代后期开始出现.它们中的许多是用汇编语言写就的并且仅能用于为其编写的微处理器上.当这些微处理器变得过时的时候,它们使用的OS也厄运同临.只能在新的处理器上从新写一遍才能运行.今天,许多这种早期的系统只不过成了人们模糊的记忆,还有人能记起MTOS吗?当C语言出现后,OS可以用一种高效的,稳定的和可移植的方式来编写.这种方式对使用和经营有直接的吸引力,因为它承载着人们当微处理器废弃不用时能保护他们的软件投资的希望.听起来,有点儿像商业市场营销中的一段传奇故事.用C来编写OS已经成了一种标准直至今天.总之,软件的可复用性已经为人接受而且正在很好地发挥作用.
  
  在20世纪80年代早期,我特别喜爱的OS是Wendon操作系统;大概只要150美金,就可以获得它的C源代码库.它是一个开发套件,人们可以通过选择一些组件来构建自己的OS---整个过程就像是从中餐菜单里订餐一样.比如,可以从库中的多个可行选项列表中精选出一种任务调度算法和内存管理方案.
  
  许多用于嵌入式系统的的商业操作系统在20世纪80年代获得了蓬勃发展.(Wendon)这一原始的炖菜已经发展成为了商业操作系统这一现代炖肉.今天已经有几打的商业性操作系统可供选择.出现了许多互相竞争的产品,如VxWorks,pSOS,Neculeus和WindowsCE.
  
  许多嵌入式系统根本就没有操作系统,只不过有一个控制环而已.对很简单的嵌入式系统来说,这可能已经足够.不过,随着嵌入式系统在复杂性上的增长,一个操作系统显得重要起来,因为否则的话,将使(控制)软件复杂度变得极不合理.可悲的是,现实中确实有一些复杂得另人生畏的嵌入式系统,而且它们之所以变得复杂就因为它们的设计者坚持认为它们的系统不需要操作系统.
  
  渐渐地,更多的嵌入式系统需要被连接到某些网络上,因而,需要在嵌入式系统中有网络协议栈(支持);甚至很多宾馆中的门把手都有一个连接到网络的微处理器.
  
  把网络栈添加到一个仅用控制环来实现的简单嵌入式系统所带来的复杂程度可能足以唤起人们对一个操作系统的渴望.
  
  除了各种商业性操作系统以外,还有多种私拥操作系统.其中,有很多是涂鸦式写就的,像Cisco公司的IOS等.有些则源于对别的操作系统的改写,像很多网络产品都衍生于同一版本的伯克利UNIX操作系统,因为后者有完整的网络支持能力;而还有一些则基于公共域OS,比如KA9Q就来源于PhilKarn.
  
  作为侯选的嵌入式操作系统,LINUX有一些引人的优势:它可以移植到多个有不同结构的CPU和硬件平台上,很好的稳定性,各种性能的升级能力,而且开发更容易.。
  
  开发工具--打破了传统仿真器的阻碍
  在开发嵌入式系统中极为关键的一项是有各种可用的工具.就像任何一个行当一样,好的工具有助于快捷而圆满地完成任务;在嵌入式系统开发的不同阶段,可能要用到不同的工具.
  
  传统上,开发嵌入式系统的首选工具是仿真器。这是一块比较昂贵的设备,一般插于微处理器和它的总线之间的电路中,从而让开发者监视和控制所有输入和输出 微处理器的各种活动和行为.在装配起来,可能有一些困难,并且由于它们的侵入性,装上后可能造成不稳定 的性能;尽管这样,它们却能在总线级上给出一个系统正在发生什么的清晰的描绘并排除了很多在硬件和软件 接口最底层上的猜测工作.
  
  在以往,一些工程项目依赖它--经常在开发周期中的各个阶段--作为主要的调试工具.不过,一旦当编制的软件 有能力支持一个串型口的时候,大量的调试可以不用ICE而使用别的方法来完成.同样,大部分新一代的嵌入式系统 采用蛮像食谱式的微处理器设计;通信工作的启动代码常常是具备的以使串型口尽快地工作,这意味着开发者能 在没有ICE的情况下也能很好地进展;去掉了ICE,从而降低了开发成本.一旦串型口可以工作起来,便能用于支持那 些日渐复杂的开发工具的相关(软件)层
  
  LINUX基于GNU C 编译器;后者作为GNU工具集的一组成部分,和源码级调试器gdb一起工作,提供了在开发一个嵌入式 LINUX系统中要用到的所有软件工具.下面是在为一个新的硬件开发一个新的嵌入式LINUX系统时要用到的典型调试 工具的序列和步骤:
  
  1:写出或移植一段启动代码(后面再详细讨论);
  
  2:写一段代码在串型口上输出一字符串,像"Hello,World!"(其实,我更喜欢人类发明电话后,通过电话说的第一句话"Watson, come here I need you");
  
  3:移植gdb目标码使之能在串型口上工作.这将允许向另一台正运行着gdb程序的LINUX主机会话;你只不过要告诉 gdb是通过串型口调试该目标程序;gdb通过串型口与你的测试计算机上的gdb目标码会话并给出全部C源码级的 调试信息.你也可以利用这一(通信)能力把附加的代码下载到RAM或闪存中.
  
  4:借助gdb,执行余下的直到LINUX内核开始接管之前的所有硬件和软件的初始化代码.
  
  5: 一旦LINUX内核启动后,上述的串型口就成为LINUX的控制台端口并可以利用它的便利来进行后继开发过程.再使用gdb的内核调试版本kgdb.这一步常常不是必需的.如果你有一个网络连接,比如,10BaseT,你或许会想让它紧接着工作起来.
  
  6: 如果你的目标平台运行的Linux kernel是全功能的(即:未经删减过功能),你可以利用gdb或其图形化替代品如xgdb去调试你的应用进程.
  
  实时--真是这样吗?
  轻率,大部分的系统并不是如此。嵌入式系统经常被错误地说做实时系统,但是它们中的大多数并不具备实时特性。实时性仅仅是相对的。实时严谨地定义应为硬实时:能在极短的时间(毫秒级)内响应,并以某种确定的方式处理事件。现在,许多硬实时功能正逐渐集中在DSP或ASIC的设计中,通过一些适当的硬件,如FIFO,DMA或其它专用硬件来实现。
  
  对大多数系统来说,有1到5毫秒的实时响应时间应足够了。当然,另一种宽松的要求也是可以接受的,例如:
  
  Windows 98的处理监视器崩溃画面的中断,要求必须在4微秒之内处理的,占所有情况的98%;而在20微秒之内处理的,占各情况的100%.
  
  这些宽松的实时要求可以很容易达到.实现它们过程中涉及到一些探讨,包括现场切换,中断延迟,任务选优和调度.
  
  现场切换曾一度成为操作系统界的一个热点话题,不过,由于大多数CPU在这点上处理得比较令人满意而且CPU速度现在已经变得足够的快,现场切换现已不再是主要关注点了.
  
  实时的严格性要求通常应由一个中断例程或内核中的现场驱动函数来处理以确保行为的一致性.当中断发生后,处理该中断所用的时间,即中断延迟,在很大程度上,由中断优先级与其它能临时屏蔽该中断的软件决定.
  
  (实时系统中的)中断必须应被高效地设计和安排以确保满足时间上的要求,就像在其它OS中那样.在Intel X86处理器系列中,这项工作可以能被扩充了实时性的Linux很好地处理.(实时Linux,即:RTLinux,参看http://www.rtlinux.org/).从本质上说,它提供了一个把Linux作为其后台任务而运行的中断处理调度器.(This essentially provides an interrupt processing scheduler that runs Linux as its background task)一些关键(临界)中断可以不为Linux其他部分所知地得到服务(处理),因而,你就有了对临界时间的控制权.这种做法提供了实时级别和时间限制性较为宽松的基本Linux级别之间的界面.并提供了一个与别的嵌入式操作系统类似的实时处理框架.从根本上讲,为满足实时性要求,采用了把实时性的关键(临界)代码段隔离开来并进行高效的安排,然后对该段代码的处理结果再以更一般的方式(或许在进程级别上)来做进一步处理.
  
  嵌入式系统--定义
  一种观点认为: 如果某种应用没有用户界面,从而,用户不能直接地和它交互,那么它就是嵌入式系统.这当然太过简单化了.电梯控制系统是嵌入式系统,但却有一个用户界面: 选择楼层的按钮和显示电梯正到达几层的指示器. 对于那些连入网络的嵌入式系统,如果该系统包含一个用于监视和控制的web服务器,界面上的区别就更显模糊了.一个较好的定义应强调在该系统的重要功能或主要用途上.
  
  由于Linux可以提供一个用以执行嵌入功能的基本内核以及各种你想要的用户界面元素,所以Linux有很强的通用特点.它
相关内容
赞助商链接