00000000.htm

来自「水木社区 embeded 版精华区 下载」· HTM 代码 · 共 332 行 · 第 1/3 页

HTM
332
字号
较令人满意而且CPU速度现在已经变得足够的快,现场切换现已不再是主要关注点了.&nbsp;<br />实时的严格性要求通常应由一个中断例程或内核中的现场驱动函数来处理以确保行为的&nbsp;<br />一致性.当中断发生后,处理该中断所用的时间,即中断延迟,在很大程度上,由中断优先级&nbsp;<br />与其它能临时屏蔽该中断的软件决定.&nbsp;<br />(实时系统中的)中断必须应被高效地设计和安排以确保满足时间上的要求,就像在其它O&nbsp;<br />S中那样.在Intel&nbsp;X86处理器系列中,这项工作可以能被扩充了实时性的Linux很好地处理&nbsp;<br />.(实时Linux,即:RTLinux,参看<a href="http://www.rtlinux.org/).从本质上说,它提供了一个把">http://www.rtlinux.org/).从本质上说,它提供了一个把</a>&nbsp;<br />Linux作为其后台任务而运行的中断处理调度器.(This&nbsp;essentially&nbsp;provides&nbsp;an&nbsp;inte&nbsp;<br />rrupt&nbsp;processing&nbsp;scheduler&nbsp;that&nbsp;runs&nbsp;Linux&nbsp;as&nbsp;its&nbsp;background&nbsp;task)一些关键(临&nbsp;<br />界)中断可以不为Linux其他部分所知地得到服务(处理),因而,你就有了对临界时间的控&nbsp;<br />制权.这种做法提供了实时级别和时间限制性较为宽松的基本Linux级别之间的界面.并提&nbsp;<br />供了一个与别的嵌入式操作系统类似的实时处理框架.从根本上讲,为满足实时性要求,采&nbsp;<br />用了把实时性的关键(临界)代码段隔离开来并进行高效的安排,然后对该段代码的处理结&nbsp;<br />果再以更一般的方式(或许在进程级别上)来做进一步处理.&nbsp;<br />嵌入式系统--定义&nbsp;<br />一种观点认为:&nbsp;如果某种应用没有用户界面,从而,用户不能直接地和它交互,那么它就是&nbsp;<br />嵌入式系统.这当然太过简单化了.电梯控制系统是嵌入式系统,但却有一个用户界面:&nbsp;选&nbsp;<br />择楼层的按钮和显示电梯正到达几层的指示器.&nbsp;对于那些连入网络的嵌入式系统,如果该&nbsp;<br />系统包含一个用于监视和控制的web服务器,界面上的区别就更显模糊了.一个较好的定义&nbsp;<br />应强调在该系统的重要功能或主要用途上.&nbsp;<br />由于Linux可以提供一个用以执行嵌入功能的基本内核以及各种你想要的用户界面元素,&nbsp;<br />所以Linux有很强的通用特点.它能处理嵌入性任务和有关用户界面两方面的作业.可以把&nbsp;<br />Linux看作如下的一个连续体:&nbsp;<br />从一个只有内存管理,任务调度,定时器服务的缩简的微内核到一个支持各种文件系统和&nbsp;<br />多种网络服务的完整服务器.&nbsp;<br />一个最小的嵌入式系统仅需如下基本组成部分:&nbsp;<br />1&nbsp;:&nbsp;一个用作引导的可用设施(工具);&nbsp;<br />2&nbsp;:&nbsp;一个具备内存管理,进程管理,和定时器服务的Linux微内核;&nbsp;<br />3&nbsp;:&nbsp;一个初始进程;&nbsp;<br />为让上面的最小嵌入式系统变得有一定实用性,尚需加上一些东西:&nbsp;<br />1&nbsp;:&nbsp;硬件的驱动程序;&nbsp;<br />2&nbsp;:&nbsp;一个或几个应用进程以提供必要的应用功效.&nbsp;<br />随着对系统要求的增加,也许还要用到下面这些组件:&nbsp;<br />1&nbsp;:&nbsp;一个文件系统(或许放在ROM或RAM中);&nbsp;<br />2&nbsp;:&nbsp;TCP/IP&nbsp;网络协议栈;&nbsp;<br />3&nbsp;:&nbsp;一个磁盘用来存放半易失性数据和提供交换能力.&nbsp;<br />硬件平台&nbsp;<br />挑选最好的硬件是一项很复杂的工作,充满着各种顾忌和干扰:公司的政策,各种成(偏)见&nbsp;<br />,其它工程的影响以及缺乏完整或准确的信息.&nbsp;<br />成本经常是一个关键性因素.当你着眼成本时,一定要考虑产品的整体成本,而不要只看到&nbsp;<br />CPU;有时一个快速而廉价的CPU可能成了这个产品的耗价的问题根源,一旦当你加上总线&nbsp;<br />和延迟逻辑以便同你的各种外设协同工作的时候.如果你是一个仅管听命的软件员,那么&nbsp;<br />你就只能对早已作好的决定撞运气了,如果你是系统的设计者,就需要尽力制订一个合理&nbsp;<br />的预算并且所选用的硬件要能令你满意地处理实时任务.&nbsp;<br />从实际中观察CPU到底需要多快方能把工作做好,然后把这个速度乘3(才是系统将所要的&nbsp;<br />CPU速度);因为CPU在理论上所能达到的能力到了现实中总是难以置信地大打折扣!不要忘&nbsp;<br />记缓存对你的系统的影响.&nbsp;<br />也要计算出总线需要运行多快,如果有二级总线(像一条PCI总线那样),也要把它们包含进&nbsp;<br />来;一条慢的或过多参与DMA传输的总线能够让一个快速的CPU变成在爬行.&nbsp;<br />有集成外设的CPU很不错,因为很少有硬件需要调试.而且,为支持主流CPU,它们的驱动程&nbsp;<br />序经常是可用的.不过在我以往的工程中,这些芯片对外设的组合好象总是不合理或者缺&nbsp;<br />少我们期望的性能(功能);同样,正因为这些外设被集成在一起,所以不要设想这会是一个&nbsp;<br />最低价的(硬件平台)方案.&nbsp;<br />把10磅的Linux塞进5磅的口袋&nbsp;<br />对Linux的一个通常观点是,它由于太大而不宜用作嵌入式系统.这种观点不一定是真实的&nbsp;<br />.面向PC机的Linux典型发布版有很多你根本用不上的功能特征甚至也超过了一个真正PC&nbsp;<br />用户的需求.&nbsp;<br />首先,我们要把内核和各种任务分开来.标准的Linux内核总是长驻内存的.每一个要运行&nbsp;<br />的应用程序需要从磁盘中装载到内存中,并在那里被执行.当该程序运行结束,它占用的内&nbsp;<br />存被释放掉,也就是说,该程序被卸载掉.在一个嵌入式系统中,可能不存在一个磁盘.因系&nbsp;<br />统的复杂程度和硬件的不同设计,有两种方法可用以摆脱对一个磁盘的依赖性.在一个简&nbsp;<br />单的系统中,当系统启动后,内核和各种应用进程均驻留在内存中--这是大多数传统嵌入&nbsp;<br />式系统的工作方式.Linux也支持这种方式.&nbsp;<br />使用Linux,&nbsp;出现了另外一种方式.既然Linux有装载和卸载程序的能力,一个嵌入式系统&nbsp;<br />可以利用这一点以节省RAM.考虑一个比较典型的系统:有大约8兆到16兆的闪存和8兆RAM&nbsp;<br />;那么闪存可以被用作文件系统.用闪存驱动程序作为从闪存到文件系统的界面.作为一种&nbsp;<br />选择,也可以用一个闪存磁盘.这是用闪存来摆脱系统对一个磁盘的需求(依赖).使用这种&nbsp;<br />方式的一个例子是M-System(<a href="http://www.m-systems.com/)中的DiskOnChip技术,它可以">http://www.m-systems.com/)中的DiskOnChip技术,它可以</a>&nbsp;<br />支持160MB.所有应用程序以文件的形式被存放在闪存文件系统中并在必要的时候被装载&nbsp;<br />到内存中;这种&quot;用到时才装载&quot;的能力是一个很强大的特征,从而可以很容易地具有(支持&nbsp;<br />)以下各种能力:&nbsp;<br />1:&nbsp;允许系统启动后抛弃(释放)那些初始化代码(空间).典型地,Linux用到很多运行在内&nbsp;<br />核外部的工具性程序(utilities).它们通常仅在系统初始化期间运行一次,以后将再也用&nbsp;<br />不到.而且,它们以互斥的方式,一个接一个地依序运行.这样,随着系统的启动,一段内存&nbsp;<br />可以被反复地使用:&quot;以页调入&quot;的方式运载每一个程序.这可以很好地节省内存,特别是处&nbsp;<br />理像网络栈那样的对象时,因为这些对象一经配置便永不更变.&nbsp;<br />2:&nbsp;如果Linux之支持可动态装卸模块的特征被包含在内核之中,不仅各种应用程序,驱动&nbsp;<br />程序也可被动态装卸.这样,系统能够检查硬件环境并有选择性地仅仅装载那些适应当前&nbsp;<br />硬件环境的软件.这可以取消(降低)让一个程序以占用更多闪存的代价处理众多硬件变数&nbsp;<br />的复杂性.&nbsp;<br />3:&nbsp;系统的升级更加标准化(模块化),你可以常常在系统运行过程中升级一些应用和驱动&nbsp;<br />程序.&nbsp;<br />4:&nbsp;配置信息和运行时间参数可作为数据文件存放在闪存中.&nbsp;<br />无虚拟内存交换&nbsp;<br />另外一个Linux的特性就是虚拟内存交换。这一特性将应用程序的编写引入歧途,应用程&nbsp;<br />序的内存需求量可以无限制地上升,因为操作系统在磁盘中提供了交换空间。而在一个&nbsp;<br />无盘的嵌入式系统中,这种特性就用不上了。&nbsp;<br />如此强大的功能,在嵌入式系统中竟无用武之地。事实上,在一个严格的实时系统中你&nbsp;<br />可能并不需要这种特性,因为它会导致定时功能的失控。如同其它的嵌入式系统一样,&nbsp;<br />软件的设计必须很紧凑,以适应较小的物理内存。&nbsp;<br />注意,这取决于你的CPU体系,比较明智的做法是保留Linux的这段代码,毕竟,砍掉这&nbsp;<br />些代码,还是要付出一些工作量的。但是,这些代码依然有保留的理由。因为它们能够&nbsp;<br />支持代码共享,多个进程可以共享某一软件的同一拷贝。如果无此功能,那么,每一个&nbsp;<br />程序都必须拥有库程序的独立拷贝,例如:printf&nbsp;。&nbsp;<br />将交换空间大小简单地置为零,就可以关掉系统虚拟内存的分页交换机制了。当你的程&nbsp;<br />序要求内存大于实际的内存时,系统的表现就如同交换空间溢出时一样:你的程序不会&nbsp;<br />被加载,或者,当要求过多内存时,malloc&nbsp;调用失败。&nbsp;<br />在许多的CPU体系中,虚存机制提供的内存管理可使进程的地址空间相互隔离。一般在嵌&nbsp;<br />入式系统中不是这样,地址空间是简单的,平坦的情况。Linux的虚存机制使出错的进程&nbsp;<br />不致影响整个系统。在许多嵌入式系统中,因为效率原因而设置的全局数据,同时被几&nbsp;<br />个进程所共享,这在Linux中也存在,那就是内存共享,它可以经过设置,使某一段内存&nbsp;<br />成为共享内存。&nbsp;<br />文件系统&nbsp;<br />许多嵌入式系统不存在一个磁盘或者一个文件系统。没有它们中的任何一个,Linux也可&nbsp;<br />以运行。正如前面提到的那样,应用任务可以随同内核一起被编译并在启动时作为一个映&nbsp;<br />像被加载.对简单系统来说,这已经胜任.不过,它却缺少前面描述到的各种灵活性.&nbsp;<br />事实上,如果你观察过许多商业性嵌入式系统,你会发现他们把文件系统作为可选项来提&nbsp;<br />供.大部分要么是一个私人拥有的(专门)文件系统,要么是一个与MS-DOS兼容的文件系统&nbsp;<br />.Linux不但支持许多其它文件系统也支持MS-DOS兼容的文件系统,通常推荐使用除MS-DO&nbsp;<br />S兼容文件系统以外的其它文件系统,因为它们有较优的健壮性和容错性.Linux也有检查&nbsp;<br />和修复工具(不过商业卖主一般不提供),这对从网络上进行更新的闪存系统尤为重要.如&nbsp;<br />

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?