Skip to content

Latest commit

 

History

History
256 lines (163 loc) · 26.2 KB

File metadata and controls

256 lines (163 loc) · 26.2 KB

一、开始

您即将开始处理您的下一个项目,这一次它将运行 Linux。 在你把手指放到键盘上之前,你应该想些什么呢? 让我们从高层次的角度来看一下嵌入式 Linux,看看它为什么流行,开放源码许可证的含义是什么,以及运行 Linux 需要什么样的硬件。

Linux 在 1999 年左右首次成为嵌入式设备的可行选择。 就在那时,Axis(DVR)发布了他们的第一个基于 https://www.axis.com 的网络摄像头和 TiVo(https://business.tivo.com)他们的第一个数字录像机(DVR)。 自 1999 年以来,Linux 变得越来越流行,到了今天,它已经成为许多类别产品的首选操作系统。 2021 年,运行 Linux 的设备超过 20 亿台。 这包括大量使用 Linux 内核的安卓(Android)智能手机,以及数以亿计的机顶盒、智能电视和 Wi-Fi 路由器,更不用说数量较小的各种设备,如车辆诊断、磅秤、工业设备和医疗监护设备。

在本章中,我们将介绍以下主题:

  • 选择 Linux
  • 什么时候不应该选择 Linux
  • 与球员见面
  • 在项目生命周期中移动
  • 导航开放源码
  • 为嵌入式 Linux 选择硬件
  • 获取本书的硬件
  • 配置您的开发环境

选择 Linux

为什么 Linux 如此普及? 为什么这么简单的东西需要运行像 Linux 这样复杂的东西才能在屏幕上显示流媒体视频呢?

简单的答案是摩尔定律:英特尔的联合创始人戈登·摩尔(Gordon Moore)在 1965 年观察到,芯片上的元件密度大约每两年就会翻一番。 这适用于我们在日常生活中设计和使用的设备,就像它适用于台式机、笔记本电脑和服务器一样。 大多数嵌入式设备的核心是一个高度集成的芯片,它包含一个或多个处理器内核,并与主存储器、大容量存储器和多种类型的外围设备接口。 这被称为片上系统SoC,并且 SoC 的复杂性根据摩尔定律不断增加。 典型的 SoC 有一本长达数千页的技术参考手册。 您的电视不会像以前的模拟电视机那样简单地显示视频流。

数据流是数字的,可能是加密的,需要进行处理才能创建图像。 您的电视已经(或即将)连接到互联网。 它可以从智能手机、平板电脑和家庭媒体服务器接收内容。 它可以(或很快就会)用来玩游戏等等。 您需要一个完整的操作系统来管理这种复杂程度。

以下是推动采用 Linux 的一些要点:

  • Linux 具有必要的功能。 它有一个很好的调度器,一个很好的网络堆栈,支持 USB,Wi-Fi,蓝牙,多种存储介质,对多媒体设备的良好支持等等。 它勾选了所有的方框。
  • Linux 已经移植到了广泛的处理器体系结构上,包括一些在 SoC 设计中非常常见的体系结构-ARM、MIPS、x86 和 PowerPC。
  • Linux 是开放源码的,因此您可以自由获取源代码并根据需要对其进行修改。 您或代表您工作的人员可以为您的特定 SoC 板或设备创建主板支持包。 您可以添加主线源代码中可能缺少的协议、功能和技术。 您可以删除不需要的功能,以减少内存和存储需求。 Linux 是灵活的。
  • Linux 有一个活跃的社区;就 Linux 内核而言,非常活跃。 每隔 8 到 10 周就会有一个新的内核发行版,每个发行版都包含来自 1000 多名开发人员的代码。 活跃的社区意味着 Linux 是最新的,并且支持当前的硬件、协议和标准。
  • 开源许可证保证您可以访问源代码。 没有与供应商挂钩的产品。

出于这些原因,Linux 是复杂设备的理想选择。 但有几点我应该在这里提一下。 复杂性使其更难理解。 再加上快速发展的开发过程和开源的分散结构,您必须投入一些精力来学习如何使用它,并在它发生变化时不断地重新学习。 我希望这本书能对这个过程有所帮助。

什么时候不选择 Linux

Linux 适合您的项目吗? Linux 在所解决的问题证明其复杂性是合理的情况下工作得很好。 在需要连通性、健壮性和复杂用户界面的情况下,它尤其适用。 然而,它不能解决所有问题,所以在你开始之前,以下是一些需要考虑的事情:

  • 你的硬件能胜任这项工作吗? 与 VxWorks 或 QNX 等传统的实时操作系统(RTOS)相比,Linux 需要更多的资源。 它至少需要一个 32 位处理器和更大的内存。 我将在有关典型硬件要求的一节中详细介绍。
  • 你有合适的技能吗? 项目的早期部分,电路板提升,需要详细了解 Linux 及其与您的硬件的关系。 同样,在调试和调优应用时,您需要能够解释结果。 如果你没有内部的技能,你可能想把一些工作外包出去。 当然,读这本书会有帮助!
  • 您的系统是实时的吗? Linux 可以处理许多实时活动,只要 您关注某些细节,我将在第 21 章实时编程中详细介绍这些细节。
  • 您的代码是否需要监管部门的批准(医疗、汽车、航空航天等)? 监管验证和确认的负担可能会让另一个操作系统成为更好的选择。 即使您选择在这些环境中使用 Linux,从为现有产品(如您正在构建的产品)提供 Linux 的公司购买商业发行版也是有意义的。

仔细考虑这些点。 也许最好的成功指标是寻找运行 Linux 的类似产品,看看他们是如何做到这一点的;遵循最佳实践。

与选手见面

开源软件从何而来? 谁写的? 具体地说,这与嵌入式开发的关键组件(工具链、引导加载程序、内核和根文件系统中的基本实用程序)有何关系?

主要参与者如下:

  • 开放源码社区:毕竟,这是生成您将要使用的软件的引擎。 社区是一个松散的开发者联盟,他们中的许多人以某种方式获得资金,可能是由非营利组织、学术机构或商业公司提供资金。 他们共同努力,以推动各种项目的目标。 它们的数量很多,有的很小,有的很大。 在本书的其余部分,我们将使用一些 Linux 本身、U-Boot、BusyBox、Buildroot、Yocto 项目,以及 GNU 保护伞下的许多项目。
  • CPU 架构师:这些是设计我们使用的 CPU 的组织。 这里最重要的是 ARM/Linaro(ARM Cortex-A)、Intel(x86 和 x86_64)、SiFive(RISC-V)和 IBM(PowerPC)。 它们实现或至少影响对基本 CPU 体系结构的支持。
  • SoC 供应商(Broadcom、Intel、MicroChip、NXP、Qualcomm、TI 等):他们从 CPU 架构师那里获取内核和工具链,并对其进行修改以支持他们的芯片。 他们还创建参考板:下一级用来创建开发板和工作产品的设计。
  • 电路板供应商和 OEM:这些人员采用 SoC 供应商的参考设计,并将其嵌入到特定产品中,例如机顶盒或摄像头,或者创建更通用的开发板,如研华和 Kontron 的产品。 一个重要的类别是廉价的开发板,如 BeagleBoard/Beaglebone 和 Raspberry Pi,它们已经创建了自己的软件和硬件附加生态系统。
  • 商业 Linux 供应商:西门子(Mentor)、Timesys 和 Wind River 等公司提供商业 Linux 发行版,这些发行版已经过多个行业(医疗、汽车、航空航天等)的严格监管验证和验证。

这些组件形成一个链条,您的项目通常在最后,这意味着您不能自由选择组件。 您不能简单地从https://www.kernel.org/获取最新内核,除非在极少数情况下,因为它不支持您正在使用的芯片或主板。

这是嵌入式开发中持续存在的问题。 理想情况下,链中每个环节的开发人员都会将他们的更改推向上游,但事实并非如此。一个内核中有数千个未合并补丁的情况并不少见。 此外,SoC 供应商倾向于只为他们最新的芯片积极开发开源组件,这意味着对任何超过几年历史的芯片的支持都将被冻结,不会收到任何更新。

其结果是,大多数嵌入式设计都是基于旧版本的软件。 它们不会收到安全修复、性能增强或较新版本中的功能。 心脏出血(OpenSSL 库中的一个 bug)和 Shellock(bash shell 中的一个 bug)等问题没有得到修复。 我将在本章后面的安全主题下详细讨论这一点。

看你怎么办? 首先,询问您的供应商(恩智浦、德州仪器和 Xilinx,仅举几例):他们的更新策略是什么,他们多久修改一次内核版本,当前的内核版本是什么,之前的版本是什么,以及他们在上游合并更改的政策是什么? 一些供应商正以这种方式大踏步前进。 你应该更喜欢他们的薯条。

其次,你可以采取措施让自己更自给自足。 第 1 节中的章节更详细地解释了依赖关系,并向您展示了您可以帮助自己的位置。 不要只接受 SoC 或电路板供应商提供给您的封装,盲目使用,而不考虑其他选择。

在项目生命周期中移动

本书分为四个部分,分别反映了项目的各个阶段。 这些阶段不一定是连续的。 通常,它们是重叠的,您需要返回以重新查看以前做过的事情。 但是,它们代表了开发人员在项目进行过程中的关注点:

  • 嵌入式 Linux 元素(第 1 章8)将帮助您设置开发环境,并为后续阶段创建工作平台。 它通常被称为板启动阶段。
  • 系统架构和设计选择(第 9 章15)将帮助您了解您必须做出的一些设计决策,这些决策涉及程序和数据的存储、如何在内核设备驱动程序和应用之间分配工作以及如何初始化系统。
  • 编写嵌入式应用(第 16 章18)展示了如何打包和部署 Python 应用,如何有效利用 Linux 进程和线程模型,以及如何在资源受限的设备中管理内存。
  • 调试和优化性能(第 19 章21)介绍了如何在应用和内核中跟踪、分析和调试代码。 最后一章解释了如何在需要时针对实时行为进行设计。

现在,让我们把重点放在构成本书第一部分的嵌入式 Linux 的四个基本元素上。

嵌入式 Linux 的四大要素

每个项目都从获取、定制和部署这四个元素开始:工具链、引导加载程序、内核和根文件系统。 这是本书第一节的主题。

  • 工具链:为 目标设备创建代码所需的编译器和其他工具。
  • bootloader:初始化板并加载 Linux 内核的程序。
  • 内核:这是系统的核心,管理系统资源并与硬件连接。
  • 根文件系统:包含内核完成初始化后运行的库和程序。

当然,还有第五个元素,这里没有提到。 这是特定于你的嵌入式应用的程序集合,这些程序可以让设备做任何它应该做的事情,无论是称重食品杂货,显示电影,控制机器人,还是驾驶无人机。

通常,当您购买 SoC 或电路板时,会将这些元素中的一些或全部打包提供给您。 但是,由于上一段提到的原因,它们可能不是你的最佳选择。 在前八章中,我将向您介绍做出正确选择的背景知识,并向您介绍两个自动化整个过程的工具:Buildroot 和 Yocto Project。

导航开源

嵌入式 Linux 的组件是开源的,所以现在是时候考虑这意味着什么,为什么开源是这样工作的,以及这对您将从它创建的通常是专有的嵌入式设备有什么影响。

许可证

在谈到开放源码时,经常使用单词free。 刚接触该主题的人通常认为这意味着免费,而且开源软件许可证确实可以保证您可以免费使用该软件开发和部署系统。 然而,这里更重要的含义是自由,因为您可以自由地获取源代码、以任何您认为合适的方式对其进行修改,并将其重新部署到其他系统中。 这些执照给了你这个权利。 相比之下,免费软件许可允许您免费复制二进制文件,但不向您提供源代码,或者其他许可允许您在某些情况下免费使用软件,例如,用于个人用途,但不用于商业用途。 这些都不是开源的。

为了帮助您理解使用开放源码许可的含义,我将提供以下评论,但我想指出的是,我是一名工程师,而不是律师。 下面是我对许可证及其解释方式的理解。

开源许可证大致分为两类:CopyLeft许可证,如GNU 通用公共许可证(GPL);许可许可证,如BSDMIT许可证。

许可许可实质上是说,只要您不以任何方式修改许可条款,您就可以修改源代码并在您自己选择的系统中使用它。 换句话说,只要有一个限制,您就可以随心所欲地使用它,包括将其构建到可能的专有系统中。

GPL 许可证类似,但有条款,强制您将获取和修改软件的权利传递给您的最终用户。 换句话说,您共享您的源代码。 一种选择是将其完全公开,将其放到公共服务器上。 另一种方式是仅将其提供给您的最终用户,方式是以书面形式提供代码,以便在请求时提供代码。 GPL 更进一步说,您不能将 GPL 代码合并到专有程序中。 任何这样做的尝试都会使 GPL 适用于整个国家。 换句话说,您不能在一个程序中组合 GPL 和专有代码。 除了 Linux 内核,GNU 编译器集合和 GNU 调试器以及与 GNU 项目相关的许多其他免费工具都属于 GPL 的范畴。

那么,图书馆呢? 如果他们获得了 GPL 的许可,任何与他们链接的程序也将成为 GPL。 但是,大多数库都是按照GNU Lesser General Public License(LGPL)许可的。 如果是这种情况,您可以通过专有程序与它们链接。

重要音符

所有上述描述具体涉及 GPL v2 和 LGPL v2.1。 我应该提一下 GPL v3 和 LGPL v3 的最新版本。 这些都是有争议的,我承认我并不完全理解其中的含义。 然而,这样做的目的是确保任何系统中的 GPLv3 和 LGPLv3 组件都可以由最终用户替换,这符合每个人都可以使用开放源码软件的精神。

不过,GPL v3 和 LGPL v3 都有它们的问题。 这是安全方面的问题。 如果设备的所有者有权访问系统代码,那么不受欢迎的入侵者也可能有权访问系统代码。 通常情况下,防御措施是拥有由供应商等权威机构签名的内核映像,这样就不可能进行未经授权的更新。 这是不是侵犯了我修改设备的权利? 意见不一。

重要音符

TiVo 机顶盒是这场辩论的一个重要部分。 它使用的是 Linux 内核,该内核是按照 GPLv2 授权的。 TiVo 已经发布了他们的内核版本的源代码,因此遵守许可证。 TiVo 还有一个引导加载程序,它只加载由它们签名的内核二进制文件。 因此,您可以为 TiVo 盒构建修改后的内核,但不能将其加载到硬件上。 自由软件基金会(FSF)持立场,认为这不符合开源软件的精神,并将此过程称为Tivoization。 GPL v3 和 LGPL v3 就是为了明确防止这种情况发生而编写的。 一些项目,特别是 Linux 内核,一直不愿采用 GPL 版本 3 许可证,因为它们会对设备制造商施加限制。

嵌入式 Linux 硬件选择

如果您正在为嵌入式 Linux 项目设计或选择硬件,您会注意什么?

首先,内核支持的 CPU 架构-当然,除非您计划自己添加新架构! 查看 Linux5.4 的源代码,有 25 种架构,每种架构都由arch/目录中的一个子目录表示。 它们都是 32 位或 64 位体系结构,大多数都有 MMU,但也有一些没有。 嵌入式设备中最常见的是 ARM、MIPS、PowerPC 和 x86,每种都有 32 位和 64 位版本,所有都有内存管理单元(MMU)。

本书的大部分内容都是针对这类处理器编写的。 还有一个组没有 MMU,它运行 Linux 的一个子集,称为微控制器 LinuxuClinux。 这些处理器架构包括 ARC(Argonaut RISC Core)、Blackfin、MicroBlaze 和 Nios。 我会不时地提到 uClinux,但我不会详细说明,因为它是一个相当专业的主题。

其次,您需要合理数量的 RAM。 16MIB 是一个不错的最低要求,尽管用一半的空间运行 Linux 是很有可能的。 如果您愿意不厌其烦地优化系统的每个部分,甚至可以用 4MiB 运行 Linux。 它甚至有可能变得更低,但总有一天它不再是 Linux。

第三,有非易失性存储器,通常是闪存。 对于网络摄像头或简单路由器等简单设备,8 MiB 就足够了。 与 RAM 一样,如果您真的想用更少的存储空间来创建一个可行的 Linux 系统,您可以这样做,但是存储越少,就越难实现。 Linux 广泛支持闪存设备,包括原始 NOR 和 NAND 闪存芯片,以及 SD 卡、eMMC 芯片、USB 闪存等形式的托管闪存。

第四,串行端口非常有用,最好是基于 UART 的串行端口。 它不需要安装在生产电路板上,但使电路板的安装、调试和开发变得容易得多。

第五,在从头开始时,您需要一些加载软件的方法。 为此,许多微控制器板都安装了联合测试行动小组(JTAG)接口。 现代 SoC 还能够直接从可移动介质(特别是 SD 卡和微型 SD 卡)或串行接口(如 UART 或 USB)加载引导代码。

除了这些基本功能外,还有设备完成任务所需的特定硬件位的接口。 Mainline Linux 附带了适用于数千种不同设备的开源驱动程序,还有来自 SoC 制造商和第三方芯片 OEM 的驱动程序(质量不同),这些驱动程序可能包含在设计中,但请记住我对一些制造商的承诺和能力的评论。 作为嵌入式设备的开发人员,你会发现你花了相当多的时间来评估和调整第三方代码,如果你有的话,或者如果你没有的话,就和制造商联系。最后,你将不得不编写设备对设备独有的接口的支持,或者找人来帮你做这件事。

获取本书的硬件

本书中的示例是通用的,但为了使它们相关且易于遵循,我不得不选择特定的硬件。 我选择了三款样机:Raspberry Pi 4、Beaglebone Black 和 QEMU。 第一款是目前市场上最流行的基于 ARM 的单板计算机。 第二种是可广泛使用且价格低廉的开发板,可用于重要的嵌入式硬件。 第三个是机器仿真器,可用于创建一系列典型的嵌入式硬件系统。 独家使用 QEMU 很有诱惑力,但就像所有的仿真一样,它与真正的 QEMU 并不完全相同。 使用 Raspberry PI 4 和 Beaglebone Black,您可以获得与真实硬件交互并看到真实 LED 闪烁的满足感。 虽然 Beaglebone Black 现在已经有几年的历史了,但它仍然是开源硬件(与 Raspberry PI 不同)。 这意味着电路板设计材料对任何人来说都是免费的,任何人都可以在他们的产品中构建 Beaglebone Black 或其衍生产品。

无论如何,我鼓励您尝试尽可能多的示例,使用这三个平台中的任何一个,或者使用您可能需要使用的任何嵌入式硬件。

覆盆子派 4

在撰写本文时,Raspberry Pi 4 型号 B 是由 Raspberry Pi 基金会生产的款微型双显示器台式电脑。 他们的网站是 https://raspberrypi.org/。 PI 4 的技术规格包括:

  • Broadcom BCM2711 1.5 GHz 四核 Cortex-A72(ARM®V8)64 位 SoC
  • 2、4 或 8 提供 DDR4 RAM
  • 2.4 GHz 和 5.0 GHz 802.11ac 无线,蓝牙 5.0,BLE
  • 一种用于调试和开发的串口
  • MicroSD 插槽,可用作引导设备
  • 用于为主板供电的 USB-C 连接器
  • 2 个全尺寸 USB 3.0 和 2 个全尺寸 USB 2.0 主机端口
  • 千兆以太网端口
  • 2 个微 HDMI 端口,用于视频和音频输出

此外,还有一个 40 针扩展接头,其子板种类繁多,称为HATS(Hardware Attp On Top),允许您调整该板以执行许多不同的事情。 但是,对于本书中的示例,您不需要任何帽子。 取而代之的是,你将利用 Pi 4 的内置 Wi-Fi 和蓝牙(Beaglebone Black 没有)。

除了董事会本身,您还需要以下内容:

  • 能够提供 3 安或更高电流的 5V USB-C 电源
  • 带有 3.3V 逻辑电平引脚的 USB 转 TTL 串行电缆,如 Adafruit 954
  • MicroSD 卡和一种从开发 PC 或笔记本电脑向其写入数据的方式,将软件加载到电路板上需要使用这些卡
  • 以太网电缆和连接它的路由器,因为有些示例需要网络连接

接下来是 Beaglebone 黑色。

Beaglebone Black

Beaglebone 和后来的 BeagleboneBlack 都是为 CircuitCo LLC 生产的信用卡大小的小型开发板设计的开放式硬件。 信息的主存储库位于https://beagleboard.org/。 本规范的要点如下:

  • 至 IT AM335x 1 GHz ARM®Cortex-A8 Sitara SOC
  • 512 MiB DDR3 RAM
  • 2 或 4 GiB 8 位 eMMC 板载闪存
  • 一种用于调试和开发的串口
  • MicroSD 插槽,可用作引导设备
  • 迷你 USB OTG 客户端/主机端口,也可用于为主板供电
  • 全尺寸 USB 2.0 主机端口
  • 10/100 以太网端口
  • 用于视频和音频输出的 HDMI 端口

此外,还有两个 46 针扩展接头,其子板种类繁多,称为CAPES,可让适配板来做许多不同的事情。 但是,您不需要为本书中的示例安装任何大写字母。

除了董事会本身,您还需要以下内容:

  • 迷你 USB 转 USB-A 电缆(随主板提供)。
  • 可与主板提供的 6 针 3.3V TTL 电平信号接口的串行电缆。 BeagleBoard 网站上有兼容电缆的链接。
  • MicroSD 卡和一种从开发 PC 或笔记本电脑向其写入的方式,将软件加载到电路板上需要使用这些卡。
  • 以太网电缆和连接它的路由器,因为有些示例需要网络连接。
  • 能够提供 1 安或更高电流的 5V 电源。

除上述外,第 12 章用分线板制作原型还要求 下列:

  • SparkFun 型全球定位系统-15193 突破板。
  • Saleae Logic 8 逻辑分析仪。 该设备将用于探测 Beaglebone Black 和 neo-M9N 之间 SPI 通信的引脚。

QEMU

QEMU 是一个机器仿真器。 它有种不同的风格,每种风格都可以模仿处理器体系结构和使用该体系结构构建的许多电路板。 例如,我们有以下内容:

  • qemu-system-arm:32 位 ARM
  • qemu-system-mips:MIPS
  • qemu-system-ppc:PowerPC
  • qemu-system-x86:x86 和 x86_64

对于每个体系结构,QEMU 都会模拟一系列硬件,您可以使用-machine help选项查看这些硬件。 每台机器都模拟该电路板上通常可以找到的大多数硬件。 可以选择将硬件链接到本地资源,例如对模拟磁盘驱动器使用本地文件。

下面是一个具体的例子:

$ qemu-system-arm -machine vexpress-a9 -m 256M -drive file=rootfs.ext4,sd -net nic -net use -kernel zImage -dtb vexpress- v2p-ca9.dtb -append "console=ttyAMA0,115200 root=/dev/mmcblk0" -serial stdio -net nic,model=lan9118 -net tap,ifname=tap0

前面命令行中使用的选项如下:

  • -machine vexpress-a9:创建采用 Cortex A-9 处理器的 ARM 多功能 Express 开发板的仿真
  • -m 256M:用 256 MiB 的 RAM 填充它
  • -drive file=rootfs.ext4,sd:将 SD 接口连接到本地文件rootfs.ext4(包含文件系统映像)
  • -kernel zImage:从名为zImage的本地文件加载 Linux 内核
  • -dtb vexpress-v2p- ca9.dtb:从本地文件vexpress-v2p-ca9.dtb加载设备树
  • -append "...":将此字符串附加为内核命令行
  • -serial stdio:将串行端口连接到启动 QEMU 的终端,通常这样您就可以通过串行控制台登录到仿真机器
  • -net nic,model=lan9118:创建网络接口
  • -net tap,ifname=tap0:将网络接口连接到虚拟网络接口tap0

要配置网络的主机端,您需要User Mode Linux(UML)项目中的tunctl命令;在 Debian 和 Ubuntu 上,程序包名为uml-utilites

$ sudo tunctl -u $(whoami) -t tap0

这将创建名为tap0的网络接口,该接口连接到仿真 QEMU 机器中的网络控制器。 配置tap0的方式与任何其他接口完全相同。

所有这些选项都将在接下来的章节中详细介绍。 我将在我的大多数示例中使用 Versatile Express,但是使用不同的机器或架构应该很容易。

调配您的开发环境

我只使用了开源软件,既用于开发工具,也用于目标操作系统和应用。 我假设您将在您的开发系统上使用 Linux。 我使用 Ubuntu20.04LTS 测试了所有主机命令,因此对该特定版本略有偏爱,但任何现代 Linux 发行版都可能工作得很好。

摘要

嵌入式硬件将继续变得更加复杂,遵循摩尔定律设定的轨迹。 Linux 拥有高效利用硬件的能力和灵活性。 我们将一起学习如何驾驭这股力量,这样我们就能打造出让用户满意的健壮产品。 本书将带您经历嵌入式项目生命周期的五个阶段,从嵌入式 Linux 的四个要素开始。

种类繁多的嵌入式平台和快速的开发速度导致了孤立的软件池。 在许多情况下,您将依赖该软件,特别是由您的 SoC 或电路板供应商提供的 Linux 内核,并且在较小程度上依赖于工具链。 一些 SoC 制造商越来越善于将他们的更改推向上游,这些更改的维护也变得越来越容易。 尽管有这些改进,为您的嵌入式 Linux 项目选择正确的硬件仍然是一项充满风险的工作。 开源许可遵从性是在嵌入式 Linux 生态系统上构建产品时需要注意的另一个主题。

在本章中,我们向您介绍了本书中将使用的硬件和一些软件(即 QEMU)。 稍后,我们将研究一些功能强大的工具,它们可以帮助您为您的设备创建和维护软件。 我们报道 Buildroot 并深入挖掘 Yocto 项目。 在我描述这些构建工具之前,我将介绍嵌入式 Linux 的四个元素,您可以将它们应用于所有嵌入式 Linux 项目,无论它们是如何创建的。

下一章将介绍其中的第一个部分,即工具链,为您的目标平台编译代码所需的工具链。