⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 嵌入式系统
💻
📖 第 1 页 / 共 4 页
字号:
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>虚拟内存的调入功能可以被关掉,只要将交换空间的大小设置为零。然后,如果你写的程序比实际的内存大,系统就会当作你的运行用尽了交换空间来处理;这个程序将不会运行,或者malloc将会失灵。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>在许多CPU上,虚拟内存提供的内存管理可以将不同程序分开,防止它们写到其它地址的空间上。这在嵌入式系统上通常不可能,因为它只支持一个简单、扁平的地址空间。Linux的这种功能有助于其发展。它减少了胡乱的编写程序造成系统崩溃的可能性。许多嵌入式系统基于效率方面的原因有意识使用程序间可以共享的“全局”数据。这也可以通过Linux共享内存功能来支持,共享的只是指定的内存部分。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN><B>文件系统</B></SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>许多嵌入式系统没有磁盘或者文件系统。Linux不需要它们也能运行。如前所述,应用程序任务可以和内核一起编写,并且在引导时作为一个影像加载。对于简单的系统来说,这就够了。然而,它缺乏前面所说的灵活性。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>实际上,许多商业性嵌入式系统,提供文件系统作为选项。许多或者是专用的文件系统或者是MS-DOS-Compatible文件系统。Linux提供MS-DOS-Compatible文件系统,同时还有其它多种选择。之所以提供其它选择是因为它们更加强大而且具有容错功能。Linux还具有检查和维护的功能,商业性供应商往往不提供这些。这对于Flash系统来说尤其重要,因为它是通过网络更新的。如果系统在升级过程中失去了能力,那它就没有用了。维护的功能通常可以解决这类问题。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>文件系统可以被放在传统的磁盘驱动器、Flash 
  Memory或其它这类的介质上。而且,用于暂时保存文件,一个小RAM盘就足够了。</SPAN><SPAN lang=EN-US>Flash 
  Memories被分割成块。这些块中也许包括一个含有当CPU启动时运行的最初的软件的引导块。这可能包括Linux </SPAN><SPAN 
  lang=EN-US>引导代码。剩余的Flash可以用作文件系统。Linux的内核可以通过引导代码从Flash</SPAN><SPAN 
  lang=EN-US>复制到RAM,或者还有一个选择,内核可以被存储在Flash的一个独立部分,并且直接从那里执行。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>另外对于一些系统来说还有一个有趣的选择,那就是将一个便宜的CD-ROM包含在内。这比Flash Memory </SPAN><SPAN 
  lang=EN-US>便宜,而且通过交换CD-ROM支持简单的升级。有了这个,Linux 只要从 
  CD-ROM上引导,并且象从硬盘上一样从CD-ROM上获得所有的程序。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>最后,对于联网的嵌入式系统来说,Linux 支持NFS(Network File </SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>System)。这为实现联网系统的许多增值功能打开了大门。第一,它允许通过网络上加载应用程序。这是控制软件修改的基础,因为每一个嵌入式系统的软件都可以在一个普通的服务器上加载。它在运行的时候也可以用来输入或输出大量的数据、配置和状态信息。这对用户监督和控制来说是一个非常强大的功能。举例来说,嵌入式系统可以建立一个小的RAM磁盘,包含的文件中有与当前状态信息同步的内容。其它系统可以简单的把这个RAM磁盘设置为基于网络的远程磁盘,并且空中存取状态文件。这就允许另一个机器上的Web服务器通过简单的CGI</SPAN> 
  </DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</SPAN></SPAN><SPAN 
  lang=EN-US>Script存取状态信息。在其它电脑上运行的其它应用程序包可以很容易的存取数据。对更复杂的监控,应用程序包如Matlab(http://www.mathworks.com/products/matlab/),可以用来在操作员的PC或工作站的提供系统运行的图形展示。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN><B>引导——LILO和BIOS在哪里</B></SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</SPAN>当一个微处理器第一次启动的时候,它开始在预先设置的地址上执行指令。通常在那里有一些只读内存,包括初始化或引导代码。在PC上,这是BIOS。它执行了一些低水平的CPU初始化和其它硬件的配置。BIOS继续辨认哪个磁盘里有操作系统,把操作系统复制到RAM并且转向它。实际上,这非常复杂,但对我们的目标来说也非常重要。在PC上运行的Linux依靠PC的 
  </SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>BIOS来提供这些配置和OS加载功能。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>在一个嵌入式系统里经常没有这种BIOS。这样你就要提供同等的启动代码。幸运的是,嵌入式系统并不需要PC</SPAN><SPAN 
  lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>BIOS引导程序那样的灵活性,因为它通常只需要处理一个硬件的配置。这个代码更简单也更枯燥。它只是一指令清单,将固定的数字塞到硬件寄存器中去。然而,这是关键的代码,因为这些数值要与你的硬件相符而且要按照特定的顺序进行。所以在大多数情况下,一个最小的通电自检模块,可以检查内存的正常运行、让LED闪烁,并且驱动其它必须的硬件以使主Linux 
  </SPAN><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>OS启动和运行。这些启动代码完全根据硬件决定,不可随意移动。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>幸运的是,许多系统都有为核心微处理器和内存所定制的菜单式硬件设计。典型的是,芯片制造商有一个样本主板,可以用来作为设计的参考——或多或少与新设计相同。通常这些菜单式设计的启动代码是可以获得的,它可以根据你的需要轻易的修改。在少数情况下,启动代码需要重新编写。</SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>为了测试这些代码,你可以使用一个包含‘模拟内存’的电路内置模拟器,它可以代替目标内存。你把代码装到模拟器上并通过模拟器调试。如果这样不行,你可以跳过这一步,但这样就要一个更长的调试周期。</SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>这个代码最终要在较为稳定的内存上运行,通常是Flash或EPROM芯片。你需要使用一些方法将代码放在芯片上。怎么做,要根据“目标”硬件和工具来定。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>一种流行的方法是把Flash或EPROM芯片插入EPROM或Flash烧制器。这将把你的程序“烧”(存)入芯片。然后,把芯片插入你的目标板的插座,打开电源。这个方法需要板上配有插座,但有些设备是不能配插座的。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>另一个方法是通过一个JTAG界面。一些芯片有JTAG界面可以用来对芯片进行编程。这是最方便的方法。芯片可以永远被焊在主板上,一个小电缆从板上的JTAG连接器,通常是一个PC卡,联到JTAG界面。下面是PC运行JTAG界面所需的一些惯用程序。这个设备还可以用来小量生产。</SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>健壮——比政治家的承诺更可靠。</SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>在PC硬件上运行时,Linux是非常可靠和稳定的,特别是和现在流行的一些操作系统相比。嵌入式内核本身有多稳定呢?对大多数微处理器来说,Linux非常好。移植到新微处理器家族的Linux内核运行起来与本微处理器一样稳定。它经常被移植到一个或多个特定的主板上。这些板包括特定的外围设备和CPU。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>幸运的是,许多代码是与处理器的,所以移植集中在差异上。其中大多数是在内存管理和中断控制领域。一旦成功移植,它们就非常稳定。前面我们讨论过,引导策略广泛依赖于硬件要求,而且你必须有计划地做一些定制的工作。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>设备驱动程序更加混乱:有些稳定有些不稳定。而且选择很有限;一旦你离开了通用的PC平台,你需要自己编写。幸运的是,周围有许多驱动程序,你可能可以找到一个与你的需求相近的修改一下。这种驱动程序界面已定义好。许多类的驱动程序都非常相近,所以把磁盘、网络或一系列的端口驱动程序从一个设备移植到另一个设备上通常并不难。我发现许多驱动程序都写得很好,很容易理解,但你还是要准备一本关于内核结构的书在手头。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>依我的经验,Linux至少和我用过的著名的商业性操作系统一样稳定。总之,这些操作系统和Linux的问题在于对工作过程微秒之处的误解,而不在于代码的难度或基本的设计错误。任何操作系统都有很多争论不休的故事,这里不需要重复。Linux的优势在于源代码是公开、注释清晰和文档齐全的。这样,你就可以控制和处理所出现的任何问题。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>伴随着基本内核和驱动程序,还有其它问题。如果系统有一个硬盘,那么文件系统的可靠性就成问题。我们有用磁盘进行Linux系统设计超过两年的经验。这些系统几乎从未正常关闭过。电源随时都可能被中断。感觉非常好,使用的是标准(EXT2)文件系统。标准Linux初始化脚本运行fsck程序,它在检查和清除不稳定的inodes方面非常有效。将默认的每隔30秒运行更新程序改为每隔5或10秒运行是比较明智的。这样缩短了数据在进入磁盘之前,待在高速缓冲存储器内的时间,降低了丢失数据的可能性。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN><B>如何发展</B></SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>嵌入式Linux的确有它的缺陷。比如,虽然它并不比某些商业竞争对手差多少,但它的确是个贪婪的存储器。这可以通过减少一些不必要的功能来弥补,但这可能会花很长的时间,而且如果不仔细的话,还可能带来很大的困扰。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>许多Linux的应用程序都要用到虚拟内存,在许多嵌入式系统中,是没有价值的,所以不要以为一个没有磁盘的嵌入式系统可以运行任何Linux应用程序。</SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>内核调试工具都不怎么好,特别是在较底层的。kgdb可以使错误定位非常容易,你只要重新启动。不幸的是,打印语句更麻烦。</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>然而,对我来说最糟糕的是心理上的问题。Linux非常的灵活。嵌入式系统总的来说却不灵活;而且它们完全是为最有效实现预定功能而严格设计的。现在的趋势是保持灵活性、保持总体目标功能、尽量少做修改。这个目标是崇高的,但是,所付出的代价将是针对具体的工作做出巨大的调整。保持灵活性将导致额外的工作,带着额外的软件包,而且有时还要降低性能。一个反复出现的例子就是配置。考虑在一个网络界面配置IP地址,这通常是通过从启动script上运行ifconfig程序来完成的。这是一个28K的程序,从配置文件上调用数据,可以用几行代码代替,初始化合适的结构。然而,即使这非常合理,但它仍然有害,因为它用一种从未使用过的方法扭曲了软件。</SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt">
  <P><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>底线</SPAN></P></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN lang=EN-US><SPAN 
  style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  </SPAN>Linux在嵌入式系统中的应用是可行的。它有用、可靠。它的发展成本和替代者一致。</SPAN></DIV>
  <DIV class=Section1 style="LAYOUT-GRID-LINE: 15.6pt"><SPAN 
  lang=EN-US>&nbsp;<o:p></o:p></SPAN></DIV></BLOCKQUOTE></BODY></HTML>

⌨️ 快捷键说明

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