00000000.htm

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

HTM
332
字号
果系统在升级中断电,可能导致系统无法再用.一个修复工具通常可以排解此类问题.&nbsp;<br />文件系统可以放在一个传统磁盘驱动中,或闪存中,或任何可用的其它介质中.同样,一个&nbsp;<br />小的RAM&nbsp;disk常常可以很好地存放暂时性文件(易失性文件).闪存被分隔成很多小块(并&nbsp;<br />被组织起来).它们中可能有一个引导块,它存放了CPU上电后运行的第一个软件.可能存放&nbsp;<br />的就是Linux的引导程序.余下的闪存块可以被用作文件系统.Linux的内核可以被引导程&nbsp;<br />序从闪存中拷贝到RAM中;或者,作为另一种选择,可以把内核放在闪存的一个独立区中并&nbsp;<br />从那里直接运行.&nbsp;<br />对一些系统来说,另一可行的选择是包含一个廉价的CD-ROM驱动.它可能比闪存还要便宜&nbsp;<br />.并且借助更换CD-ROM盘片就可很容易地得到升级.通过这种方法,Linux只需从CD-ROM启&nbsp;<br />动并可以像对一个硬盘那样从该CD-ROM中获得所有用到的程序.&nbsp;<br />最后,对于网络上的嵌入式系统(有网络支持的嵌入式系统),Linux支持NFS(Network&nbsp;Fil&nbsp;<br />e&nbsp;System).这一着打开了在一个网络支持系统中实现各种增值特征的通道.首先它允许通&nbsp;<br />过网络加载各种应用程序.由于用在每一个嵌入式系统上的软件可以从一个公用的服务器&nbsp;<br />上加载,这在控制软件的修订或升级中是很重要的.在系统运行的过程中,导入和导出数据&nbsp;<br />,配置,状态信息的一个备份也很有用.对用户监控而言,这是一个非常强大的特征;举例来&nbsp;<br />说,一个嵌入式系统可能装配了一个RAM&nbsp;disk,它包含着与系统当前状态的更新维持一致&nbsp;<br />的(状态)文件.那么别的嵌入式系统仅需通过网络把这个RAM&nbsp;disk作为远程磁盘mount过&nbsp;<br />来便可以访问那些位于远端RAM&nbsp;disk中的状态文件.这也允许在另一台机器上的WEB服务&nbsp;<br />器借助简单的CGI脚本来访问那些状态信息.运行在其他机器上的应用程序包能够很容易&nbsp;<br />地访问这些数据.对更复杂的监控,像MatLab(<a href="http://www.mathworks.com/products/mat">http://www.mathworks.com/products/mat</a>&nbsp;<br />lab/)这样的一个应用程序包能很容易地用图形化来显示在一个系统操作者的PC或工作站&nbsp;<br />上的系统操作.&nbsp;<br />引导内核--当没有LILO或BIOS时&nbsp;<br />当一个微处理器最初启动时,它首先执行在一个预定地址处的指令.通常这个位置是只读&nbsp;<br />内存,其中存放着系统初始化或引导程序.在PC中,它就是BIOS.这些程序要执行低级的CP&nbsp;<br />U初始化并配置其他硬件.BIOS接着判断出哪一个磁盘包含有操作系统,再把OS拷贝到RAM&nbsp;<br />中,并把控制权交给OS.实际上,整个过程远非这么简单,不过对我们的理解已经足够.运行&nbsp;<br />在PC上的Linux系统依赖于该PC的BIOS来提供这些配置和OS加载功能.&nbsp;<br />在一个嵌入式系统里,常常没有上述的BIOS;这样,你就需要去提供等价的启动代码.还好&nbsp;<br />,一个嵌入式系统的BIOS并不需要像PC&nbsp;BIOS引导程序那样有那么多的灵活性,因为它通常&nbsp;<br />仅需处理一种硬件配置方案.这些代码比较简单但也另人厌烦.它是一些把特定的数写入&nbsp;<br />指定硬件寄存器的指令序列.不过这是很关键的代码,因为这些数值必须要符合你的硬件&nbsp;<br />并且要按特定顺序来完成.在大多数情况下,(这些代码中)有一个最小化的加电自检模块&nbsp;<br />用以检查内存,让一些LED闪现一下,也可能探测一些其它让Linux&nbsp;OS启动和运行的必要硬&nbsp;<br />件.这些启动代码是高度硬件专用性的,因而,不具移植性.&nbsp;<br />有幸的是,大多数系统为核心微处理器和内存使用了食谱式的硬件设计.典型地,芯片制造&nbsp;<br />商有一个可供设计参考的演示板--新设计多少可以从中直接拷贝一些.对这些食谱式的设&nbsp;<br />计,经常有现成的启动代码可用,而且可以很容易地被修改以适应你的需要.很少(会遇到&nbsp;<br />)有需要从头开始编写的启动代码.&nbsp;<br />为了测试你的(启动)代码,你可以使用一个包含它自己的仿真内存的电子仿真器(in-cir&nbsp;<br />cuit&nbsp;emulator),这里的仿真内存用以替换目标内存.你把待测代码加载到仿真器中并通&nbsp;<br />过仿真器调试它.如果没有可用的仿真器,也可以跳过这一步,不过需要一个较长的调试周&nbsp;<br />期.&nbsp;<br />这些代码最终要从非易失性存储器中运行,通常是用闪存或EPROM芯片,你要想办法把这些&nbsp;<br />代码放进前述芯片中,放入的具体方法依赖于&quot;目标&quot;硬件和工具.一个常见的方法是把闪&nbsp;<br />存或EPROM芯片插入到一个EPROM或闪存&quot;烧炉&quot;中.这种方法将把你的程序&quot;烧入&quot;(存入)芯&nbsp;<br />片中.然后,把芯片插入到你目标板上的一个插槽中,打开电源.这种方法要求在板子上具&nbsp;<br />有插槽化(socketed)部分;然而,有些设备包格式(结构)不允许被插槽化(socketed).&nbsp;<br />另一种办法是通过一个JTAG接口.一些芯片包含一个JTAG接口,从而可以对芯片编程.这是&nbsp;<br />一种最简便的办法.芯片可以被永久地焊接到板子上.一段电缆从板子上的JTAG连接器(通&nbsp;<br />常是一个PC卡)连接着一个JTAG接口.接下来要求在操纵JTAG接口的PC上做一些用户定制&nbsp;<br />性编程.在仅需较少运行量的产品中,也可以使用这种方法.&nbsp;<br />健壮性---比政客的承诺还可靠&nbsp;<br />这是显而易见的,作为一种选择,Linux已被普遍地认为能够在PC平台上可靠地,稳定地&nbsp;<br />运行。嵌入式内核自身有多稳定?对于大多数微处理器来说,Linux是很好用的。将Lin&nbsp;<br />ux移植到新的微处理器体系也是非常迅捷的。一般是将其移植到一种新型的目标板,这&nbsp;<br />种新型的目标板包含有独特的外设,当然还有CPU.&nbsp;<br />幸运的是,大部分的内核代码都是相同的,因为它们与微处理器无关,所以,移植的工&nbsp;<br />作都集中在那些不同的部分,通常是一些存储器管理及中断处理程序。一旦完成,它们&nbsp;<br />往往是非常稳定。如同前面谈到的,引导的过程非常依赖于硬件的变化而变化,所以,&nbsp;<br />一定要周密地计划一番。&nbsp;<br />设备驱动程序虽然变化多端,但其中一些已相当稳定。同时,你的选择也不算太多,一&nbsp;<br />旦离开PC平台,那就只有自己去写了。所幸的是,在我们周围已有许多既有的设备驱动&nbsp;<br />程序,你总能找到一个近似的,而去修改它。驱动程序的接口是明确定义的。大多数驱&nbsp;<br />动程序之间都是相似的,所以,移植一个磁盘,网络,串行口驱动程序,从一个设备到&nbsp;<br />另一种,经常不是太难。我发现大多数的驱动程序都写的很好,并很好理解,而难题反&nbsp;<br />而是在我手上的那本讲解内核结构的书。&nbsp;<br />就我个人的经验而言,Linux与我曾经使用过的那些顶顶大名的商业操作系统一样稳定。&nbsp;<br />总的来说,关于这些操作系统(包括Linux)的问题都源于对系统工作策略的误解,而不是&nbsp;<br />纯代码bug或基本设计错误。大量的操作系统的bug故事,在这里没有必要再重提。而Li&nbsp;<br />nux的优点,就在于其源码是公开的,并有很好的注释和完整的文档说明,从而,你也就&nbsp;<br />拥有了控制与解决一切问题的能力基础。&nbsp;<br />即内核与驱动程序之后,还有一点:如果一个系统中有一只硬盘,那么,系统的可靠性&nbsp;<br />可能会成为问题。我们拥有两年的经验和时间,都沉浸在有盘嵌入式系统中。这些系统&nbsp;<br />从不关机,电源有几次被意外地断掉,可是,EXT2文件系统表现得很好。标准的Linux初&nbsp;<br />始化脚本运行了fsck程序。这个程序做了一个漂亮的检查与清理不正常节点的工作。还&nbsp;<br />有一处英明之举,也是一处较大的变动,我们将update程序由30秒执行一次,调整为5或&nbsp;<br />10秒执行一次。这使得磁盘高速缓存中的数据能较频繁地写回到磁盘里,从而,降低了&nbsp;<br />丢失数据的可能性。&nbsp;<br />没有万能钥匙&nbsp;<br />嵌入式Linux当然有它的不足。比如,它很占内存,尽管不比一些商业竞争者的情况更坏&nbsp;<br />。但可以通过消减一些不必要的功能来改善,也有可能得不偿失,因为很可能会产生比&nbsp;<br />较严重的bug。&nbsp;<br />大多数Linux应用程序都会使用虚拟内存交换,这在很多嵌入式系统中是一种非确定因素&nbsp;<br />,所以,不要假定任何一个无盘嵌入式系统能够运行什么Linux应用程序。&nbsp;<br />低等级的,内核级的调试工具仍然不是很好使。kgdb会使人感到很不适应,你常要rebo&nbsp;<br />ot&nbsp;。很不幸,调试仍然是以打印语句为主。&nbsp;<br />对于我来说最严重的问题是心理作用。Linux是一种极具适用性的操作系统。可是,嵌入&nbsp;<br />式系统在通常情况下是不具备这种性质的;它们是对于特定的用途,进行过仔细优化了&nbsp;<br />。但Linux的这种适用性倾向,保持了系统的通用性和多变性,同时也是一个奢侈的目标&nbsp;<br />,付出的代价很高,需要增添许多额外的工作,会有许多附加的程序产生,从而增加了&nbsp;<br />软件包的体积,有时还会以降低性能为代价。举一个常提到的例子--配置程序:在一个&nbsp;<br />网络接口上配置IP地址,一般是由启动脚本中的ifconfig完成的。这是一个大小约28K左&nbsp;<br />右程序,其实只用几行代码就可以完成它的工作:它负责根据配置文件中的内容初始化&nbsp;<br />一些相应的数据结构。事情就是这样:当一切成为一件合理的事情去做时,你不这样做&nbsp;<br />,又能怎样呢?不然&quot;软件&quot;意义又何在呢。&nbsp;<br />结束语&nbsp;<br />在嵌入式系统中使用Linux是可能的,并且已经成功了。它可以可靠地工作。从此,我们&nbsp;<br />就在开发的成本上有了第二种选择。&nbsp;<br />&nbsp;<br />--&nbsp;<br />&nbsp;<br />※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;smth.org·[FROM:&nbsp;166.111.167.231]&nbsp;<br /><a href="javascript:history.go(-1)">返回上一页</a><a href="index.htm">回到目录</a><a href="#top">回到页首</a><a href="00000001.htm">下一篇</a></h1></center><center><h1>BBS 水木清华站∶精华区</h1></center></body></html>

⌨️ 快捷键说明

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