将 Linux 嵌入商业产品

作者:Joel R. Williams

大多数 Linux 系统运行在 PC 平台上;然而,Linux 也可以成为嵌入式系统中可靠的主力。本文概述了嵌入式系统,并演示了在商业嵌入式系统中使用 Linux 涉及的内容。

嵌入式系统——比摩西更古老

用于控制设备的计算机,或称嵌入式系统,其历史几乎与计算机本身一样悠久。

在通信领域,早在 20 世纪 60 年代末,它们就被用于控制电动机械电话交换机,并被称为“存储程序控制”系统。“计算机”这个词在当时并不像现在这样普及,而存储程序指的是保存程序和路由信息的内存。存储这种逻辑,而不是将其硬连线到硬件中,是一个真正的突破性概念。今天,我们理所当然地认为事情就是这样运作的。

这些计算机是为每个应用定制设计的。以今天的标准来看,它们看起来像是一群变异的畸形物,具有奇怪的专用指令和与主计算引擎集成的 I/O 设备。

微处理器改变了这一点,它提供了一个小型、低成本的 CPU 引擎,可以用作更大系统中的构建块。它基于通过总线连接的外围设备,施加了一种严格的硬件架构,并提供了一个通用的编程模型,从而简化了编程。

软件也随着硬件的发展而进步。最初,只有简单的程序开发工具可用于创建和测试软件。每个项目的运行时软件通常完全从头开始编写。这几乎总是用汇编语言或宏语言编写的,因为编译器通常存在漏洞并且缺乏像样的调试器。软件构建块和标准化库的概念直到 20 世纪 70 年代中期才开始流行。

用于嵌入式系统的现成操作系统在 20 世纪 70 年代末开始出现。其中许多是用汇编语言编写的,并且只能用于编写它们的微处理器。当微处理器过时时,除非将其重写以在新微处理器上运行,否则其操作系统也会过时。今天,这些早期系统中的许多只是模糊的记忆;还有人记得 MTOS 吗?当 C 语言出现时,操作系统可以用高效、稳定和可移植的方式编写。这对管理层具有即时吸引力,因为它带来了在当前微处理器过时时保留软件投资的希望。这听起来像是一个营销宣传的好故事。用 C 语言编写的操作系统成为规范,并一直延续至今。总的来说,软件的可重用性已经站稳脚跟,并且发展得相当不错。

我在 20 世纪 80 年代早期最喜欢的操作系统是 Wendon 操作系统。只需大约 150 美元,您就可以收到一个 C 源代码库。它是一个工具包,您可以通过选择组件来构建自己的操作系统——有点像从中国菜单上点餐。例如,您可以从库中的一系列可能性中选择任务调度算法和内存管理方案。

许多用于嵌入式系统的商业操作系统在 20 世纪 80 年代应运而生。这种原始的混合物已经演变成今天的商业操作系统混合物。如今,有几十个可行的商业操作系统可供选择。一些大型厂商已经崭露头角,例如 VxWorks、pSOS、Neculeus 和 Windows CE。

许多嵌入式系统根本没有任何操作系统,只有一个控制循环。对于非常简单的系统来说,这可能就足够了;然而,随着系统复杂性的增加,操作系统变得必不可少,否则软件会变得异常复杂。可悲的是,有些极其复杂的嵌入式系统之所以复杂,仅仅是因为设计师坚持认为他们不需要操作系统。

越来越多的嵌入式系统需要连接到某种网络,因此需要网络堆栈。甚至许多酒店的门把手都连接了嵌入式微处理器。

对于仅在循环中编码的简单嵌入式系统,添加网络堆栈可能会将复杂性级别提高到需要操作系统的程度。

除了各种商业操作系统之外,还有惊人数量的专有操作系统。其中许多是从头开始创建的,例如思科的 IOS;其他的则衍生自其他操作系统。例如,许多网络产品都衍生自同一版本的 Berkeley UNIX 系统,因为它具有完整的网络功能。其他的则基于公共领域操作系统,例如 Phil Karn 的 KA9Q。

Linux 作为嵌入式操作系统是一个新的候选者,具有一些吸引人的优势。它可以移植到许多 CPU 和硬件平台,稳定、可扩展且功能范围广泛,并且易于开发使用。

工具——打破 ICE 障碍

开发嵌入式系统的关键要素是可用工具集。就像任何工艺或职业一样,好的工具可以帮助更快、更好地完成工作。在开发的不同阶段,可能需要不同的工具。

传统上,用于开发嵌入式系统的第一个工具是在线仿真器 (ICE)。这是一种相对昂贵的设备,通常会侵入微处理器及其总线之间的电路,从而允许用户监控和控制微处理器内外的所有活动。这些设备可能难以设置,并且由于其侵入性,可能会引起不稳定的性能。然而,它们非常清楚地显示了总线级别正在发生的事情,并消除了硬件/软件接口最低级别的许多猜测。

过去,一些项目依靠它作为主要的调试工具,通常贯穿开发的各个阶段。然而,一旦初始软件工作得足以支持串行端口,就可以在不使用 ICE 的情况下使用其他方法完成大部分调试。此外,大多数较新的嵌入式系统都使用相当规范的微处理器设计。通常,可以获得相应的工作启动代码,该代码可用于在短时间内使串行端口工作。这意味着通常可以很好地在没有 ICE 的情况下完成工作。消除 ICE 阶段降低了开发成本。一旦串行端口启动,它就可以用于支持几个层次越来越复杂的开发工具。

Linux 基于 GNU C 编译器,作为 GNU 工具链的一部分,它与 gdb 源代码级调试器配合使用。这提供了开发嵌入式 Linux 系统所需的所有软件工具。以下是在新硬件上启动新嵌入式 Linux 系统时使用的典型调试工具序列。

  1. 编写或移植启动代码。(我们稍后会详细讨论这一点。)

  2. 编写代码以在串行端口上打印字符串,即“Hello World”。(实际上,我更喜欢“Watson,过来,我需要你”,这是电话中说出的第一句话。)

  3. 移植 gdb 目标代码以通过串行端口工作。它与另一个运行 gdb 程序的 Linux“主机”系统通信。您只需告诉 gdb 通过串行端口调试程序即可。它通过串行端口与测试计算机上的 gdb 目标代码通信,为您提供完整的 C 源代码级调试。您可能还希望使用此相同功能将其他代码下载到 RAM 或闪存中。

  4. 使用 gdb 使其余的硬件和软件初始化代码工作,直到 Linux 内核启动。

  5. 一旦 Linux 内核启动,串行端口将成为 Linux 控制台端口,可用于后续开发。使用 kgdb,gdb 的内核调试版本。通常,不需要此步骤。如果您有网络连接,例如 10BaseT,您可能希望接下来使其工作。

  6. 一旦您在目标硬件上运行了功能齐全的 Linux 内核,您就可以调试您的应用程序进程。使用 gdb 或 gdb 的图形叠加,例如 xgdb

实时性——谁说的?

简而言之,大多数实时系统都不是。嵌入式系统经常被错误地归类为实时系统。然而,大多数系统根本不需要实时功能。实时是一个相对术语。纯粹主义者通常将硬实时定义为需要以确定性的方式并在短时间内(即微秒)响应事件。越来越多的这种严格时间范围内的硬实时功能正在专用 DSP(数字信号处理器)芯片或 ASIC(专用集成电路)中实现。此外,这些要求通常只是通过使用更深的硬件 FIFO、分散/聚集 DMA 引擎和定制硬件来设计的。

许多设计师对实时性能的需求感到苦恼,但对他们的实际需求没有清晰的了解。对于大多数系统来说,在 1 到 5 毫秒范围内的近实时响应就足够了。此外,较软的要求可能完全可以接受,例如

Windows 98 Crashed_Yet 监视器中断必须在 4 毫秒内处理 98% 的时间,并在 20 毫秒内处理 100% 的时间。

这些软要求更容易实现。满足这些要求涉及对上下文切换时间、中断延迟、任务优先级和调度的讨论。上下文切换时间曾经是操作系统人员热衷讨论的话题。然而,大多数 CPU 都能很好地处理这个问题,并且 CPU 速度已经足够快,这已不再是一个主要问题。

严格的实时要求通常应由中断例程或其他内核上下文驱动程序函数处理,以确保行为一致。延迟时间(中断发生后服务中断所需的时间)主要由中断优先级和可能暂时屏蔽中断的其他软件决定。

必须对中断进行工程设计和管理,以确保可以满足时序要求,就像任何其他操作系统一样。在 Intel x86 处理器上,这项工作可以通过 Linux 的实时扩展(RTLinux,参见 http://www.rtlinux.org/)很好地处理。这实际上提供了一个中断处理调度程序,该调度程序将 Linux 作为其后台任务运行。可以在没有 Linux 其余部分知晓的情况下服务关键中断。因此,您可以很好地控制关键时序。然后在实时级别和具有宽松时序约束的基本 Linux 级别之间提供接口。这提供了一个类似于其他嵌入式操作系统的实时框架。本质上,实时关键代码被隔离并“工程化”以满足要求,而此代码的结果以更通用的方式处理,可能在应用程序任务(进程)级别。

嵌入式系统——一个定义

一种观点是,如果应用程序没有用户界面,则它必须是嵌入式的,因为用户不会直接与之交互。当然,这过于简单化了。电梯控制计算机被认为是嵌入式的,但它具有用户界面:用于选择楼层的按钮和用于显示电梯当前所在楼层的指示器。对于连接到网络的嵌入式系统,如果系统包含用于监控和控制的 Web 服务器,则这种区别甚至更加模糊。更好的定义可能侧重于系统的预期功能或主要用途。

由于 Linux 既提供了用于执行嵌入式功能的基本内核,又具有您可能想要的所有的用户界面花哨功能,因此它非常通用。它可以处理嵌入式任务和用户界面。将 Linux 视为一个连续体:从精简的微内核(具有内存管理、任务切换和定时器服务,仅此而已)扩展到功能齐全的服务器,支持全系列的文件系统和网络服务。

一个最小的嵌入式 Linux 系统只需要这些基本要素

  • 启动实用程序

  • Linux 微内核,由内存管理、进程管理和定时服务组成

  • 初始化进程

为了使其执行有用的操作并仍然保持最小化,您需要添加

  • 硬件驱动程序

  • 一个或多个应用程序进程以提供所需的功能

当您添加更多功能时,您可能还需要这些
  • 文件系统(可能在 ROM 或 RAM 中)

  • TCP/IP 网络堆栈

  • 用于存储半瞬态数据和交换功能的磁盘

硬件平台

选择最佳硬件是一项复杂的工作,并且充满了公司政治、偏见、其他项目的遗留问题以及缺乏完整或准确信息的陷阱。

成本通常是关键问题。在查看成本时,请确保查看总产品成本,而不仅仅是 CPU。有时,一旦您添加总线逻辑和延迟以使其与您的外围设备配合使用,快速、廉价的 CPU 可能会变成昂贵的狗产品。如果您是软件极客,那么硬件决策很可能已经做出。但是,如果您是系统设计师,那么您的尽职调查是制定实时预算并让自己确信硬件可以胜任这项工作。

首先要对 CPU 需要多快才能完成工作有一个现实的看法——然后将其乘以三倍。令人惊讶的是,理论上的 CPU 容量在现实世界中消失得有多快。不要忘记考虑您的应用程序将如何利用任何缓存。

此外,计算出总线需要多快才能运行。如果有辅助总线,例如 PCI 总线,也包括它们。慢速总线或充满 DMA 流量的总线会使快速 CPU 慢如蜗牛。

带有集成外围设备的 CPU 很不错,因为需要调试的硬件更少,并且经常已经有可用的工作驱动程序来支持流行的 CPU。然而,在我的项目中,这些芯片似乎总是具有错误的外围设备组合,或者不具备我们所需的功能。此外,仅仅因为外围设备是集成的,也不要认为这会导致最便宜的解决方案。

将 10 磅重的 Linux 塞进 5 磅重的袋子里

关于 Linux 的常见看法之一是,它过于臃肿,无法用于嵌入式系统。这不一定是真的。为 PC 设置的典型 Linux 发行版具有比您需要的更多的功能,并且通常也比 PC 用户需要的更多。

首先,让我们将内核与任务分开。标准 Linux 内核始终驻留在内存中。运行的每个应用程序程序都从磁盘加载到内存中执行。程序完成时,它占用的内存将被丢弃,也就是说,程序被卸载。

在嵌入式系统中,可能没有磁盘。有两种方法可以消除对磁盘的依赖,具体取决于系统的复杂性和硬件设计。

在简单的系统中,内核和所有应用程序进程在系统启动时都驻留在内存中。这是大多数传统嵌入式系统的工作方式,Linux 也支持这种方式。

使用 Linux,第二种可能性打开了。由于 Linux 已经具有“加载”和“卸载”程序的能力,因此嵌入式系统可以利用这一点来节省 RAM。考虑一个典型的系统,它包括闪存,可能是 8 到 16MB 的闪存,以及 8MB 的 RAM。闪存可以组织为文件系统。闪存驱动程序用于将闪存连接到文件系统。或者,可以使用闪存盘。这是一种闪存部件,它向软件模拟磁盘。M-Systems 的 DiskOnChip (http://www.m-systems.com/) 就是一个例子,它可以支持高达 160MB 的容量。所有程序都作为文件存储在闪存文件系统上,并根据需要加载到 RAM 中。这种动态的“按需加载”功能是一个强大的功能,可以更轻松地支持一系列功能

  • 它允许在系统启动后丢弃初始化代码。Linux 通常使用许多在内核外部运行的实用程序。这些实用程序通常在初始化时运行一次,然后永远不再运行。此外,这些实用程序可以按顺序运行,一个接一个地运行,以互斥的方式运行。因此,可以重复使用相同的内存来“分页”每个程序,因为系统会启动。这可以真正节省内存,特别是对于诸如网络堆栈之类配置一次且永远不会更改的东西。

  • 如果内核中包含 Linux 可加载模块功能,则可以加载驱动程序以及应用程序程序。软件可以检查硬件环境,并自适应地仅加载适用于该硬件的软件。这消除了使用一个程序来处理硬件的许多变化的复杂性,但代价是需要更多的闪存。

  • 软件升级更加模块化。您可以在闪存上升级应用程序和可加载驱动程序,通常在系统运行时进行。

  • 配置信息和运行时参数可以作为数据文件存储在闪存上。

非虚拟内存

标准 Linux 的另一个功能是其虚拟内存功能。这是一个神奇的功能,使应用程序程序员能够肆无忌惮地编写代码,而无需考虑程序有多大。程序只是溢出到磁盘的交换区域。在没有磁盘的嵌入式系统中,此功能通常不可用。

在嵌入式系统中不需要这种强大的功能。事实上,您可能不希望在实时关键系统中使用它,因为它会引入不受控制的时序因素。必须更严格地设计软件以适应可用的物理内存,就像其他嵌入式系统一样。

请注意,根据 CPU 的不同,通常建议将虚拟内存代码保留在 Linux 中,因为删除它需要相当多的工作。此外,出于另一个原因,它非常理想——它支持共享文本,允许多个进程共享软件的一个副本。如果没有它,每个程序都需要有自己的库例程副本,例如 printf

只需将交换空间大小设置为零即可关闭虚拟内存分页功能。然后,如果您编写的程序大于实际内存,则系统的行为方式将与您用完交换空间时的行为方式相同;程序将无法加载,或者如果程序请求的内存过多,则 malloc 可能会失败。

在许多 CPU 上,虚拟内存还提供进程之间的内存管理隔离,以防止它们覆盖彼此的地址空间。这在仅支持简单平面地址空间的嵌入式系统中通常不可用。Linux 将此作为奖励功能提供,以帮助开发。它降低了野指针写入导致系统崩溃的可能性。许多嵌入式系统出于效率原因而有意使用进程之间共享的“全局”数据。Linux 也通过共享内存功能支持这一点,该功能仅公开旨在共享的内存部分。

文件系统

许多嵌入式系统没有磁盘或文件系统。Linux 运行不需要这两者中的任何一个。如前所述,应用程序任务可以与内核一起编译,并在启动时作为一个映像加载。这对于简单的系统来说就足够了。然而,它缺乏前面描述的灵活性。

事实上,如果您查看许多商业嵌入式系统,您会看到它们提供文件系统作为选项。大多数要么是专有文件系统,要么是与 MS-DOS 兼容的文件系统。Linux 提供与 MS-DOS 兼容的文件系统,以及许多其他选择。通常建议选择其他选项,因为它们更健壮且容错能力更强。Linux 还具有检查和修复实用程序,这在商业供应商的产品中通常缺失。这对于通过网络更新的闪存系统尤其重要。如果系统在升级过程中断电,则可能会变得不可用。修复实用程序通常可以解决此类问题。

文件系统可以位于传统磁盘驱动器、闪存或任何其他介质上。此外,通常需要一个小的 RAM 磁盘来保存瞬态文件。

闪存被分段成块。这些块可能包括一个引导块,其中包含 CPU 启动时运行的第一个软件。这可以包括 Linux 引导代码。闪存的其余部分可以用作文件系统。Linux 内核可以由引导代码从闪存复制到 RAM,或者,内核可以存储在闪存的单独部分中并直接从那里执行。

对于某些系统,另一个有趣的替代方案是包括一个廉价的 CD-ROM 驱动器。这可能比闪存便宜,并且支持通过更换 CD-ROM 进行轻松升级。有了这个,Linux 只需从 CD-ROM 启动,并以与从硬盘驱动器相同的方式从 CD-ROM 获取其所有程序。

最后,对于联网的嵌入式系统,Linux 支持 NFS(网络文件系统)。这为在联网系统中实现许多增值功能打开了大门。首先,它允许通过网络加载应用程序程序。这是控制软件修订的终极方法,因为每个嵌入式系统的软件都可以从公共服务器加载。在运行时,导入和导出大量数据、配置和状态信息也很有用。这对于用户监控和控制来说可能是一个非常强大的功能。例如,嵌入式系统可以设置一个小型的 RAM 磁盘,其中包含它不断更新当前状态信息的文件。其他系统可以简单地将此 RAM 磁盘作为远程磁盘安装在网络上,并动态访问状态文件。这允许另一台机器上的 Web 服务器通过简单的 CGI 脚本访问状态信息。在其他计算机上运行的其他应用程序包可以轻松访问数据。对于更复杂的监控,可以使用诸如 MatLab (http://www.mathworks.com/products/matlab/) 之类的应用程序包轻松地在操作员的 PC 或工作站上提供系统操作的图形显示。

启动——LILO 和 BIOS 在哪里?

当微处理器首次通电时,它开始在预定地址执行指令。通常,在该位置有一些只读存储器,其中包含初始启动或引导代码。在 PC 中,这就是 BIOS。它执行一些低级 CPU 初始化并配置其他硬件。BIOS 继续找出哪个磁盘包含操作系统,将 OS 复制到 RAM 并跳转到它。实际上,它比这复杂得多,但这足以满足我们的目的。在 PC 上运行的 Linux 系统依赖于 PC 的 BIOS 来提供这些配置和 OS 加载功能。

在嵌入式系统中,通常没有这样的 BIOS。因此,您需要提供等效的启动代码。幸运的是,嵌入式系统不需要 PC BIOS 启动程序的灵活性,因为它通常只需要处理一种硬件配置。代码更简单,而且往往相当枯燥。它只是一系列指令,将固定数字塞入硬件寄存器。然而,这是关键代码,因为这些值对于您的硬件需要是正确的,并且通常必须以特定的顺序完成。在大多数情况下,还有一个最小的加电自检模块,用于健全性检查内存、闪烁一些 LED,并且可能会运行一些其他必要的硬件以使主 Linux OS 启动并运行。此启动代码高度依赖于硬件,并且不可移植。

幸运的是,大多数系统对核心微处理器和内存都使用相当规范的硬件设计。通常,芯片制造商有一个演示板,可以用作参考设计——或多或少地将其复制到新设计中。通常,这些规范设计都有可用的启动代码,可以相对容易地根据您的需求进行修改。很少需要从头开始编写新的启动代码。

要测试代码,您可以使用包含其自己的“仿真内存”的在线仿真器,该仿真器取代了目标内存。您将代码加载到仿真器中,并通过仿真器进行调试。如果这不可用,您可以跳过此步骤,但预计调试周期会更长。

此代码最终需要从某些非易失性存储器(通常是闪存或 EPROM 芯片)运行。您将需要某种方法将代码放入此芯片中。如何完成此操作将取决于“目标”硬件和工具。

一种流行的方法是取出闪存或 EPROM 芯片并将其插入“EPROM”或“闪存刻录器”中。这将“刻录”(存储)您的程序到芯片中。然后,将芯片插入目标板上的插槽中并打开电源。此方法要求部件“插接”在板上;但是,某些设备封装格式无法插接。

另一种方法是通过 JTAG 接口。一些芯片包括一个 JTAG 接口,该接口可用于编程芯片。这是最方便的方法。芯片可以永久焊接到板上,并且一根小电缆从板上的 JTAG 连接器(通常是 PC 卡)连接到 JTAG 接口。缺点是在 PC 上通常需要一些自定义编程才能操作 JTAG 接口。此相同设施也可以用于小批量生产。

稳健性——比政客的承诺更可靠

Linux 通常被认为在 PC 硬件上运行时非常可靠和稳定,特别是与流行的替代方案相比。嵌入式内核本身有多稳定?对于大多数微处理器,Linux 都非常好。Linux 内核移植到新的微处理器系列通常不仅仅是移植到微处理器。通常,它会移植到一个或多个特定的目标板,Linux 会移植到这些目标板。这些板包括一些特定的外围设备以及 CPU。

幸运的是,许多内核代码与处理器无关,因此移植侧重于差异。这些差异大多在内存管理和中断处理领域。一旦移植了这些,它们往往会相当稳定。如前所述,启动策略因硬件细节而异,您应该计划进行一些自定义。

设备驱动程序更像是一张百搭牌:有些比其他更稳定。此外,选择相当有限;一旦您离开无处不在的 PC 平台,您可能需要创建自己的驱动程序。幸运的是,有很多设备驱动程序在流传,您可能会找到一个接近您需要的驱动程序,可以对其进行修改。驱动程序接口是明确定义的。同类驱动程序大多非常相似,因此将磁盘、网络或串行端口驱动程序从一个设备迁移到另一个设备通常不太困难。我发现大多数驱动程序都编写得很好并且易于理解,但手头要准备一本关于内核结构的书。

根据我的经验,Linux 至少与我使用过的大牌商业操作系统一样稳定。一般来说,这些操作系统和 Linux 的问题源于对事物工作方式的微妙之处的误解,而不是硬编码错误或基本设计错误。任何操作系统都有大量的战争故事,这里无需重复。Linux 的优势在于源代码可用、注释良好且文档非常完善。因此,您可以控制处理出现的任何问题。

除了基本内核和设备驱动程序之外,还出现了一些其他问题。如果系统有硬盘驱动器,则文件系统的可靠性就会受到质疑。我们有超过两年的嵌入式 Linux 系统设计的现场经验,该设计采用了磁盘。这些系统几乎从不正确关闭。电源只是在随机时间断开。使用标准 (EXT2) 文件系统的体验一直非常好。标准 Linux 初始化脚本运行 fsck 程序,该程序在检查和清理任何悬空的 inode 方面做得非常出色。可能明智的一个更改是以 5 或 10 秒的间隔而不是默认的 30 秒运行 update 程序。这缩短了数据在刷新到磁盘之前停留在本地内存缓存中的时间窗口,从而降低了丢失数据的可能性。

骷髅在哪里?

嵌入式 Linux 确实有一些缺点。首先,它可能非常消耗内存,尽管它并不比一些商业竞争对手更糟糕。 其中一部分可以通过移除不常用的功能来减少,但这可能比它本身的价值更耗时,并且如果处理不当,可能会导致一些难以解决的错误。

大多数 Linux 应用程序都依赖于虚拟内存,但在许多嵌入式系统中,虚拟内存的价值值得怀疑,所以不要认为没有磁盘的嵌入式系统就能运行任何 Linux 应用程序。

内核级别的调试工具并不是那么出色,尤其是在较低级别。 kgdb 很容易发生“硬着陆”(hard landings),你只能重启。 不幸的是,打印语句的使用比我们希望的要多。

然而,对我来说最糟糕的问题是心理上的。 Linux 非常灵活。 嵌入式系统通常不灵活;相反,它们是经过高度工程设计的,以最佳地执行其预期功能。 存在一种趋势,即保留灵活性,保持通用功能并尽可能少地进行更改。 这些都是崇高的目标,但它们的代价是无法针对特定工作对系统进行精细调整。 保持这种灵活性可能会导致额外的工作和携带额外的软件包袱,有时还会涉及降低性能的权衡。 反复出现的一个例子是配置。 考虑配置网络接口上的 IP 地址,这通常是通过从启动脚本运行 ifconfig 程序来完成的。 这是一个 28K 的程序,可以用几行代码替换,以初始化适当的结构,并使用来自配置文件的数据。 然而,虽然这样做是合理的,但它仍然让人感到“不舒服”,因为它以软件从未打算使用的方式扭曲了软件。

底线

在嵌入式系统中使用 Linux 是可行的,并且已经被实践过。 它能工作。 它很可靠。 开发成本与替代方案相当。

词汇表

Embedding Linux in a Commercial Product
Joel R. Williams 是 emLinux 的首席架构师。 他为网络应用和电信开发嵌入式系统。 可以通过 joel@emlinux.com 联系他,或访问 http://www.emlinux.com/
加载 Disqus 评论