第一章 Introduction

第一章:介绍

嵌入式开发多年来经历了显著的演变,从受限的、特定任务的设备转变为一个充满无限可能的领域。曾经孤立运行的嵌入式应用现在涵盖了从边缘人工智能到软件定义硬件的各种功能,不断突破性能和复杂性的界限。

传统上,像C和C++这样的语言一直是嵌入式开发的支柱,几十年来很好地满足了行业的需求。然而,嵌入式系统的性质在不断发展,要求从现状中进行转变。随着应用变得越来越复杂,对安全性和安全的要求达到了新的高度,依赖现状变得不可持续。

应对未来嵌入式应用的需求需要拥抱现代、高性能的语言,这些语言提供增强的安全性和安全特性。在众多竞争者中,Rust作为一种强有力的选择脱颖而出,准备以其性能、安全性和表达能力的独特组合彻底改变嵌入式领域。

嵌入式Rust领域正在快速增长,各大厂商频繁加入战局,推动生态系统向前发展。同时,专注于嵌入式Rust的教育材料也有了显著改进,为学习者提供了保持前沿所需的资源。

本书旨在为读者提供必要的知识和技能,以应对嵌入式Rust编程不断变化的格局,特别关注ESP设备和Rust标准库。它首先奠定嵌入式系统的基础概念,深入探讨微控制器,并概述Espressif硬件和软件生态系统。后续章节深入讲解不同外设的编程,通过实际示例和动手练习指导读者。

无论您是想探索嵌入式开发领域的资深Rust程序员,还是涉足Rust领域的嵌入式开发者,本书都能满足您的需求。此外,对于嵌入式系统和Rust都陌生的人来说,本书也是一个全面的资源,可帮助他们深入了解这一令人兴奋的技术交叉领域。

1.1 什么是嵌入式系统?

嵌入式系统是您通往物理模拟世界的数字入口。嵌入式系统的核心与传统计算机一样,包含一个计算元素。虽然传统计算机专注于与人类交互,但嵌入式系统则专注于与环境交互。因此,嵌入式系统的性质可以更加专注。这意味着嵌入式系统相比传统计算机具有更具体的计算焦点。例如,考虑一台普通的个人计算机(PC)。它需要专注于提供无缝的用户体验,即使是对人类来说看似轻量级的任务。这包括在进行在线软件更新时处理文字处理,流媒体音乐,监控键盘和鼠标输入,更新显示器显示等多任务同时进行。

相比之下,嵌入式系统将被设计成执行特定的、专注的任务。例如,嵌入式系统可能会捕获温度传感器的值并相应地调整风扇速度。即使涉及用户输入,通常也非常简单,比如几个按钮来配置设定点。与传统计算机不同,嵌入式系统旨在与物理环境接口,而不是主要与人类用户交互。

嵌入式系统常被称为特定任务计算设备,鉴于其工作范围。虽然这个定义近年来有所变化,但在许多应用中仍然基本成立。如图1.1所示,嵌入式系统的核心是一个电子控制单元(ECU),通常包含一个微控制器设备。在一端,嵌入式系统通过按钮、传感器和开关等接收来自环境的物理输入。这些输入由微控制器处理,而另一端,微控制器反过来控制不同的执行器输出,如电机、灯光、屏幕或扬声器。嵌入式系统可以独立运行,也可以与更大的系统交互(例如,在汽车中)。

这意味着嵌入式系统可以具有使其实现与数字世界通信的接口。通信接口可以是有线的,如串行接口(例如UART或USB)或无线的(例如WiFi或蓝牙)。这种通信接口还可以启用与其他输入和输出设备的连接。

图1.2展示了一些嵌入式系统的例子。鉴于此类应用及其需求的性质,嵌入式系统通常在几种约束下运行。

嵌入式系统需要小巧轻便、高效节能且成本低廉。

以游戏机控制器为例。它需要足够小,以便玩家舒适地操作,并且不能太重。此外,控制器需要能够运行相当长的时间而无需充电。最后,这些控制器可能制造了数百万个,所以它们不能太贵,每一分钱都很重要。将其与普通非嵌入式计算机进行比较,考虑的因素完全不同。

1.2 嵌入式系统的趋势

嵌入式系统有望实现显著增长,受到物联网和工业4.0的推动,但面临固有的限制,如有限的计算能力、存储和连接性。尽管创新的架构方法有助于克服这些限制,但行业通常遵循“学习、适应和优化”的方法,将其他领域的技术进步调整以满足嵌入式系统的独特需求。这种现象由必要性驱动,促进了电力效率、硬件加速和优化技术等领域的创新。通过持续的学习、适应和创新,嵌入式系统行业可以利用最新的进展,同时解决其独特的约束,从而开发出越来越有能力且高效的智能互联设备。

嵌入式系统的一些当前趋势包括以下内容:

  1. 人工智能(AI):随着世界继续拥抱人工智能(AI)的变革潜力,其对嵌入式系统的影响正在迅速获得动力。
    尽管非嵌入式领域已经见证了令人印象深刻的AI应用,将AI能力集成到嵌入式系统中承诺解锁新的可能性领域,特别是在物联网(IoT)、边缘AI、汽车和工业4.0等领域。
    然而,这种集成并非没有挑战。其中一个最重要的障碍在于训练和部署AI模型所需的计算能力,受制于嵌入式系统的约束。传统方法通常涉及将原始数据传输到云端进行处理,这种方法在功耗和延迟方面存在局限性,使其不太适合功率受限的设备。
    为了应对这些挑战,出现了多个支持嵌入式AI的平台,包括TinyML、TensorFlow Lite、PytorchMobile、OpenVINO、NvidiaJetson、EdgeImpulsed、Caffe 2和MXNet等。这些平台旨在优化AI模型,以便在资源受限的设备上部署,使各种用例受益于AI能力。
    嵌入式AI最有前途的应用之一在于制造业中的预测性维护。通过利用在传感器数据上训练的AI模型,制造商可以预测设备故障并主动安排维护,最大限度地减少停机时间并最大化运营效率。同样,智能结构健康监测系统可以采用AI检测和预测结构缺陷,确保关键基础设施的安全和寿命。
    在农业领域,AI驱动的植物健康监测系统有潜力彻底改变作物管理实践。通过分析传感器数据和视觉线索,这些系统可以识别疾病的早期迹象、营养缺乏和其他潜在威胁,及时进行干预并优化作物产量。
    随着对智能互联设备需求的不断增长,嵌入式AI的采用有望加速。尽管挑战依然存在,但硬件和软件解决方案的持续进步为未来铺平了道路,在日常生活中无缝集成智能决策和自动化。

  2. 片上系统(SoC):嵌入式系统中的片上系统(SoC)趋势已成为操作系统、虚拟化和容器启用使用增加背后的驱动力。随着嵌入式设备变得更加复杂和功能丰富,对复杂的软件架构和资源管理的需求显著增长。
    传统上,嵌入式系统严重依赖裸机编程,应用程序设计为直接在硬件上运行,而无需底层操作系统。然而,随着SoC集成多个处理器、专用硬件加速器和大量内存,有效管理这些资源的复杂性变得艰巨。
    进入嵌入式设备的操作系统。嵌入式Linux、FreeRTOS、Zephyr等操作系统提供了一层抽象,简化了资源管理、任务调度和进程间通信。通过利用操作系统,嵌入式开发者可以专注于构建应用程序,同时依靠操作系统来处理低级硬件交互和资源分配。
    此外,现代SoC的强大功能和可扩展性为嵌入式系统中的虚拟化铺平了道路。虚拟化允许多个操作系统或环境在同一硬件平台上并发运行,有效地整合资源并实现高效的工作负载隔离。这种能力在需要强大安全性、故障隔离或同时运行多个软件堆栈的应用中尤其有价值。
    像容器化这样的虚拟化技术也在嵌入式世界中获得了牵引力,这是由于对轻量级、便携式和可扩展软件部署的需求驱动的。容器将应用程序及其依赖项封装到自包含的包中,实现跨不同硬件平台的无缝分发和执行。这种方法简化了应用程序的部署、更新和维护,同时确保无论底层硬件配置如何,行为一致。
    此外,SoC和虚拟化的结合为嵌入式系统利用云原生技术和架构打开了新的可能性。通过在嵌入式设备上运行容器化工作负载,开发者可以利用云计算中使用的相同工具、流程和最佳实践,促进边缘设备与云平台之间的更无缝集成。
    虽然在嵌入式系统中采用操作系统、虚拟化和容器引入了额外的复杂性,但也解锁了新的灵活性、可扩展性和效率水平。随着SoC的不断发展,提供更强大和集成的能力,这些软件架构对于充分利用嵌入式硬件和开发复杂、高度能力的嵌入式应用程序将变得越来越重要。

  3. 软件定义平台:科技行业见证了向软件定义硬件的重大转变,这是一种赋予软件更大控制权的范式。这种方法提供了许多优势,包括增加了定制化,简化了产品更新,并减少了为每个新应用设计定制硬件的开销。
    其核心是一种通用硬件平台,可以通过软件编程控制和配置。这一范式减少了为每个新兴应用设计专用硬件解决方案的需求,促进了更加敏捷和适应性强的开发周期。
    无线和网络领域一直处于采用这一范式的前沿,软件定义无线电(SDR)和软件定义网络(SDN)作为突出的例子。在SDR的情况下,无线电设备的物理层可以被编程以执行几乎任何无线电功能,使得硬件更具便携性、灵活性和可维护性。
    此外,汽车行业通过软件定义车辆(SDV)的概念展示了强烈采纳这一范式的迹象。通过利用软件定义硬件,汽车制造商有可能简化新功能的集成,增强车辆定制,并促进空中更新,从而防患未然并延长车辆的功能寿命。
    随着技术景观继续以快速步伐演变,软件定义范式为硬件过时和有限灵活性的挑战提供了引人注目的解决方案。通过将软件与硬件依赖性解耦,这种方法使开发者能够创建更加通用、适应性强和面向未来的解决方案,最终推动创新并加速技术进步的步伐。

  4. 安全性:嵌入式系统领域发现自己陷入了一个类似于互联网早期的困境,那时安全性考虑是事后才想到的。就像互联网最初构想为“一群相互信任的用户”一样,嵌入式设备历史上都是孤立运行的,很少重视实施强大的安全措施。这种疏忽为众多漏洞铺平了道路,例如留下未加密的关键内存内容和暴露的JTAG引脚,实际上邀请潜在攻击者未经授权访问敏感数据。
    物联网(IoT)的出现和边缘设备中连接性的集成进一步加剧了嵌入式系统面临的安全挑战。2015年著名的Jeep黑客事件导致克莱斯勒召回140万辆汽车,这清楚地提醒了嵌入式行业优先考虑安全性并积极应对漏洞的必要性。
    尽管在嵌入式系统中实现强大安全性的旅程似乎令人生畏,但该行业可以从为Web应用开发的成熟安全实践中汲取灵感。这些实践主要集中在缓解软件和基于网络的攻击,为建立嵌入式系统安全提供了坚实的基础。
    然而,至关重要的是要认识到嵌入式系统面临的独特挑战超出了传统的软件和网络安全漏洞。侧信道攻击通过分析设备的功耗、时间和电磁特征来利用硬件漏洞,构成了一种独特的威胁,需要专门的对策。
    为了有效应对这些挑战,嵌入式系统行业必须采取全面的安全方法,涵盖软件和硬件方面的考虑。这种方法应优先考虑安全编码实践、硬件级保护以及在整个产品生命周期中持续进行漏洞评估。此外,行业范围内的合作和知识共享可以加速最佳实践的采用,促进嵌入式设备更加安全的生态系统。
    通过从前人的错误中学习并积极应对安全问题,嵌入式系统行业可以为未来铺平道路,届时连接设备将以最高诚信度运行,保护敏感数据并减轻潜在威胁。

  5. RISC-V:RISC-V(发音为“risk-five”)代表了处理器内核指令集架构(ISA)领域的重要转变。作为一种开源ISA,RISC-V挑战了传统的专有模式,并在知识产权(IP)权利和设计灵活性方面提供了独特的价值主张。
    从知识产权的角度来看,流行的ISA如ARM和x86需要许可协议,这可能既昂贵又会带来法律复杂性,尤其是在初创公司和小型公司中。相反,RISC-V的开源性质消除了这些障碍,允许公司在不承担重大许可费用或处理复杂的IP所有权问题的情况下设计和实现处理器内核。
    此外,RISC-V的开源性质为设计师提供了前所未有的灵活性,可以扩展和定制现有的指令集,以满足其应用或自定义IP的具体要求。这种级别的定制通常是无法通过专有、非开源ISA实现的,因为后者通常对修改施加更严格的限制。
    自问世以来,RISC-V获得了显著的关注,并催生了一个强大的生态系统。2015年,RISC-V基金会成立,围绕ISA建立了一个协作社区,促进了其成长和采用。针对RISC-V的软件工具已经得到了很好的发展,像Espressif和Microchip这样的公司已经推出了基于RISC-V架构的微控制器和片上系统(SoC)。
    此外,像SiFive这样的公司提供的解决方案使设计师能够创建自定义IP并在现场可编程门阵列(FPGA)设备上部署,开启了硬件加速和自定义硬件实现的世界。
    RISC-V的崛起有可能颠覆传统的处理器格局,使ISA的获取民主化,并赋予大小开发者和公司创新的能力,而不受专有架构的限制。随着RISC-V生态系统的不断成熟,它有望成为嵌入式系统行业的驱动力,推动创新,降低进入门槛,并开启一个可定制和开放硬件设计的新时代。

  6. 低功耗广域网(LPWAN):随着嵌入式系统的无线方面
    不断获得重要地位,为众多物联网(IoT)应用提供了连接性,这些应用涵盖智慧城市、智能制造、医疗保健、汽车等领域,
    传统无线技术在功耗和覆盖范围方面面临重大挑战这一点变得显而易见。历史上,嵌入式边缘设备中的无线通信一直受到高能耗硬件和有限传输距离(通常仅限于几百英尺)的阻碍。
    为了解决这些限制,低功耗广域网(LPWAN)技术作为一种针对物联网和低功耗、电池供电设备的有前景解决方案应运而生。
    这些技术,包括LoRaWAN、Sigfox、NB-IoT和Wi-Fi HaLow(802.11ah),提供长达几公里的扩展覆盖范围,不过是以数据吞吐量为代价的。
    LPWAN技术的出现为嵌入式系统带来了改变游戏规则的机会,实现了长距离连接,同时最小化功耗,从而延长边缘设备的电池寿命。然而,选择适合特定应用的适当LPWAN技术对于设备制造商和产品开发者来说可能是一项艰巨的任务。这些技术常常对其满足应用需求的能力做出类似声明,但其背后的复杂性和细微差别可能导致如果未能充分理解,则会产生代价高昂的失误。
    为了应对这一挑战,嵌入式系统设计师必须全面了解每种LPWAN技术的独特特性、优势和局限性。诸如功耗曲线、覆盖能力、数据速率、网络拓扑和安全特性等因素必须仔细评估并与目标应用的具体要求对应映射。
    此外,行业协作和知识共享可以在揭开LPWAN技术的神秘面纱并促进其实施的最佳实践中发挥关键作用。通过利用嵌入式系统社区的集体经验和见解,制造商可以做出明智的决策,优化其无线通信策略,并充分释放物联网和互联设备的潜力。

  7. 内存安全编程语言:嵌入式系统长期以来一直由C和C++等系统编程语言主导,这些语言提供了无与伦比的灵活性和从资源受限微控制器中榨取最大性能的能力。
    然而,这种灵活性是有代价的——嵌入式行业几十年来一直在努力解决内存和安全问题,随着应用变得越来越复杂,这一挑战仍在继续。
    虽然像C和C++这样的语言的灵活性曾经是一个重要的优势,但它也成为一把双刃剑,导致了许多与内存相关的漏洞和安全隐患。随着嵌入式领域的演变,对更强大和安全的解决方案的需求变得至关重要。
    近年来,新一代现代编程语言出现,专门针对嵌入式领域。虽然这些语言并不都能匹配C和C++的原始性能,但它们在内存安全、人体工程学和开发者生产力方面提供了令人信服的优势。像Golang、Zig、microPython、Rust和circuitPython这样的语言在嵌入式社区中获得了关注,每种语言都提供了独特的好处和权衡。
    在这些新兴语言中,Rust脱颖而出,成为强有力的竞争者,挑战了C和C++长期以来的主导地位。Rust结合了现代编程范式,具有强大的内存安全保障和媲美传统系统编程语言的性能能力。这种独特的组合引起了寻求更安全和更安全替代方案的嵌入式开发者的极大关注,而不会牺牲性能。
    随着嵌入式系统复杂性的不断增加,采用内存安全编程语言变得越来越有吸引力。通过拥抱这些现代语言,嵌入式开发者可以减轻与内存漏洞相关的风险,提高代码可靠性,并有可能减少测试和调试所需的时间和精力。
    然而,需要注意的是,选择编程语言只是确保嵌入式系统安全和安全性的综合方法的一个方面。无论使用何种语言,整个开发生命周期中都必须纳入健壮的编码实践、彻底的测试方法和持续的漏洞评估。

1.3 为什么选择Rust?

如果您正在阅读这本书,我希望您已经对Rust感兴趣了。然而,以防您还不确定,那么接下来就是原因。
Rust是一种系统编程语言,专注于提供对计算机硬件的低级控制,同时确保内存安全并防止常见的编程错误。它最初是Graydon Hoare的个人项目,后来被Mozilla接手。
在Rust的创建过程中,设计者们有效地总结了过去软件失败的许多原因,并设计了一种消除不安全编码实践的语言。Rust是一种现代的多范式编译系统编程语言,具有内存安全、极快的速度、零成本的抽象和非常好的可移植性,所有这些原因及更多使其成为嵌入式系统的完美选择。Rust还提供了比传统设置make脚本、单元测试和包管理更舒适的集成开发环境,比如C和C++这类语言。
在云环境中,像亚马逊、Discord、Dropbox、Facebook、谷歌和微软这样的公司已经在某种程度上采用了Rust。事实上,微软和谷歌已经证实Rust帮助消除了某些领域高达70%的安全问题。在嵌入式领域,Sensirion、Airborne Engineering、49Nord和Terminal Technologies等公司已经开始采用Rust。此外,其他一些嵌入式公司也开始在职位要求中将Rust与C和C++并列列出。
Rust的关键特性包括:

  1. 内存安全:Rust采用独特的所有权系统,无需垃圾回收器即可保证内存安全。所有权系统通过严格规定如何访问和共享内存,帮助防止空指针解引用、缓冲区溢出和数据竞争等问题。
  2. 无畏并发:Rust的所有权和借用系统允许安全和高效的并发编程。多个线程可以并发访问数据,最小化数据竞争的风险,因为编译器对可变引用强制执行严格规则。
  3. 零成本抽象:Rust提供高级抽象,不会产生运行时开销。这意味着开发者可以编写既抽象又高效的代码,抽象在编译期间大多被移除,结果性能可与C和C++等低级语言相媲美。
  4. 静态类型:Rust是静态类型的,意味着变量的类型在编译时已知。这有助于在代码运行前捕获许多错误,从而提高软件的健壮性和可靠性。
  5. 模式匹配:Rust包含强大的模式匹配能力,使得以简洁和可读的方式表达复杂条件逻辑变得更加容易。
  6. 跨平台支持:Rust设计为可在不同平台之间移植,允许开发者编写可在多种操作系统和架构上运行的代码。
  7. 社区和生态系统:Rust拥有一个活跃且不断发展的社区。它还有一个名为Cargo的包管理器,简化了依赖管理和项目设置。Rust生态系统包括用于不同目的的各种库和框架。
  8. 与其他语言的集成:Rust设计为易于与其他语言互操作,特别是C。这使得将Rust代码集成到现有项目中或利用其他语言编写的现有库成为可能。
posted @ 2025-04-14 11:29  江湖再见三月份  阅读(2)  评论(0)    收藏  举报