[译] 嵌入式工程学习指南

作者 Leehyon HNG | 14198 字, 29 分钟 | 0 评论 | 2024-09-08 | 类别 Articles

embedded, learning, roadmap, translation

本文档为一份详尽的嵌入式工程学习指南,原英文作者为 Meysam Parvizi,为有志于成为嵌入式工程师的人提供了一份全面的路线图,其中包括精选的学习资源列表。

Original: https://github.com/m3y54m/Embedded-Engineering-Roadmap


这份路线图旨在帮助渴望成为嵌入式工程师/开发者的初学者,并帮助现有从业者扩展其技能。

嵌入式工程需要对硬件功能以及软件开发和编程技能有扎实的理解。如果你真的想追求这个职业,你必须有高度的动力和热情。正如著名的谚语所说,“硬件很难!”但不要惊慌,面对这段激动人心的旅程中可能遇到的挑战要有耐心。通过投入足够的时间和努力进行练习和项目,你很快就会发现自己成为了一名真正的嵌入式工程师!😀

❓ 什么是嵌入式系统?

ISO/IEC/IEEE 24765 标准:

嵌入式系统是一个更大系统的一部分,并执行该系统的一些要求。例如,用于飞机或快速运输系统的计算机系统。
嵌入式系统的硬件和软件通常被最小化并针对特定功能进行优化。嵌入式系统至少包括一个微控制器、微处理器或数字信号处理器。嵌入式系统旨在为应用优化可靠性、成本、尺寸和节能。

“Making Embedded Systems” 书籍:

嵌入式系统是一个为其应用特定目的构建的计算机化系统。

“Computer Organization and Embedded Systems” 书籍:

一个物理系统,使用计算机控制来实现特定目的,而不是用于通用计算,被称为嵌入式系统。

Analog Devices 术语表:

嵌入式系统是将计算机(通常是微控制器或微处理器)作为系统的一个组成部分的系统。
通常,计算机对用户是相对不可见的,没有明显的应用程序、文件或操作系统。例如,运行微波炉的控制器或现代汽车的发动机控制系统。

Embedded Systems 术语表:

由计算机硬件和软件以及其他可能的机械部件或其他部分组合而成,设计用于执行专用功能。
在某些情况下,嵌入式系统是一个更大系统或产品的一部分,如汽车中的防抱死刹车系统。

🗺️ 路线图

embedded-engineering-roadmap

嵌入式系统工程路线图分为三个基本领域:软件硬件软技能

虽然嵌入式系统中硬件和软件的交集很常见,但具体的职位名称往往侧重于一个方面。例如,“嵌入式软件工程师/开发者”、“固件工程师/开发者”、“嵌入式 Linux 工程师/开发者”等职位主要关注软件开发。相比之下,“嵌入式硬件工程师”和“硬件设计工程师”等职位主要处理硬件设计和电子学。此外,还有“嵌入式系统工程师”等职位需要对硬件和软件有全面的理解。

重要的是,每个嵌入式行业的公司对某个职位的要求可能各不相同。因此,必须根据你的职业目标调整重点。如果你要找嵌入式软件职位,优先考虑路线图中列出的软件相关技能。相反,如果你对嵌入式硬件职位感兴趣,则侧重于硬件技能,并花更多时间学习电子学。

路线图提供了“嵌入式系统工程师”职位所需的重要主题指南。通过深入了解软件和硬件两个方面,你可以培养在这个动态领域中茁壮成长的必要技能。然而,如果你对软件或硬件有明确的偏好,可以相应地调整你的学习路径。

注意:个别软件和硬件技能的重要性会因公司和职位的具体要求而有所不同。

提示:为了区分不同类型的学习资源及其内容质量,具体符号用于每个项目之前。

资源类型:
📘 :书籍
🎞️ :视频
📝 :写作、文章和博客帖子
🔗 :其他不属于上述类别的链接

内容质量符号:
👶 :易于理解且适合初学者的资源。如果你对某个主题没有先前知识,请参考这些。
💎 :著名参考资料,内容真正无价且全面。如果你想深入理解某个主题,请参考这些。

😕 不知道从哪里开始!

如果你看到路线图上冗长的主题列表感到不知所措,你并不孤单。在深入研究之前,让我们通过一些简单的入门项目来轻松开始。学习嵌入式系统工程需要时间和努力。如果你一开始不理解某些东西,不要灰心。继续练习,你最终会成功的。

项目

动手项目是学习的最有效方法,而不仅仅依靠书本或文章的理论知识。进行项目可以获得实际的学习经验。即使是看似基本的项目也能教会你比毫无目标的阅读更多的东西。当你在实际项目中遇到问题时,可以参考书籍、文章和课程以帮助理解问题。

不要立即尝试构建复杂的项目。先从小型、可管理的项目开始,逐步提升。

搜索并提问!

使用搜索引擎找到你的问题答案。

如果通过搜索引擎找不到想要的内容,AI 聊天机器人也能提供帮助。请记住,AI 在有些情况下可能会给出错误答案,最好通过更可靠的参考资料确认答案。

如果对仅依赖 AI 建议有所保留,你也可以向真实的人提问:

课程和 YouTube 内容

你可能听说过 YouTube 是所大学,这是真的 — YouTube 上有大量关于嵌入式系统的宝贵免费内容。你还可以通过 Coursera 和 EdX 找到一些优秀的免费课程。此外,Udemy 也提供一些高质量的付费课程选项。

Arduino

如果你没有编程嵌入式系统的背景,Arduino 开发板和库是你入门和学习基础知识的最佳选择。请记住,大多数 Arduino 库是为学习目的开发的,并未优化用于工业。

另外,Arduino Core 负责大多数底层硬件操作,作为嵌入式工程师,你应该能够自己处理这些操作,或者至少清楚地理解它们的原理。如果你想成为专业的嵌入式开发者,你应该能够有效使用微控制器供应商提供和批准的行业标准 API 和 SDK,如 ARM Cortex-M 微控制器的 CMSIS、STM32 的 STM32Cube、Espressif 微控制器的 ESP-IDF 等。

教育网站

其他有用的路线图

IDEs

VS Code 扩展

PlatformIO

PlatformIO 是一个跨平台、跨架构、多框架的专业工具,适用于嵌入式系统工程师和为嵌入式产品编写应用程序的软件开发人员。

虽然 PlatformIO 尚未在工业和大规模项目中广泛采用,但对于个人处理小规模项目来说,它是一个优秀的选择。这是因为它极大地减少了安装框架和设置构建与调试工具的需求,使你可以专注于编程。

📚 学习资源

警告:没有必要阅读所有在这里列出的书籍、文章或观看所有视频。如果你尝试这样做,最终你会感到疲倦和失望。在合理的时间内你无法学习所有可用的内容,因为可能需要数年。重要的是学习足够多的内容以至少对所需主题有基本的理解。当然,投入更多时间学习和做项目,你的知识和专业能力会更加深厚。这里提到的一些资源仅供参考。只有在需要时才参考它们。


软技能

与其他职业类似,嵌入式工程师也需要软技能,而这些技能无法仅通过阅读或观看视频获得。这些技能是在互动和应对各种工作障碍中培养出来的。软技能的提升没有一个统一的方法。它会因个人特点而异,需要对自己优势和成长领域有自我认识。提升这些技能需要时间和努力。


电子学

基础数学与微积分

电路原理

电子学基础

数字设计

计算机架构

计算机架构是嵌入式系统的支柱,管理着硬件和软件的交互。嵌入式开发者需要掌握计算机架构,以有效地设计、开发和调试嵌入式软件。对 ARM 和 RISC-V 这两种在嵌入式系统中广泛使用的指令集架构(ISA)的专业知识是嵌入式开发者的必备技能。ARM 是主导的 ISA,而 RISC-V 凭借其开源性质和灵活性正在获得关注。


使用测试设备

嵌入式系统通常需要专门的测试设备来验证其功能和性能。这些设备包括万用表、示波器、逻辑分析仪、信号发生器、电源等工具,工程师可以使用它们测量信号、注入刺激并监测嵌入式系统的行为。

万用表

逻辑 / 协议分析仪

示波器


原型设计技能

虽然硬件设计和原型设计主要是电子硬件设计工程师的职责,但嵌入式软件工程师了解这些概念也大有裨益。这方面的知识在嵌入式系统调试过程中,识别和解决与硬件相关的问题时非常重要。掌握硬件原理,嵌入式软件工程师可以有效地定位问题的根本原因,从而更迅速、更高效地进行故障排除。

面包板搭建

面包板搭建是一种动手原型设计电路的方法,提供了一个多功能的平台用于实验和电路设计。嵌入式系统通常使用面包板,因为它们易于使用、灵活且具有成本效益。通过在面包板上连接组件,嵌入式系统开发者可以快速测试和完善他们的设计,无需永久焊接。这使得快速迭代和高效调试成为可能,使面包板成为嵌入式系统开发中的宝贵工具。

硬件设计基础

PCB 设计 / EMC

焊接 / 返工


FPGA 开发

FPGA(现场可编程门阵列)是可以配置以执行各种数字逻辑功能的专用集成电路。它们广泛应用于嵌入式系统,以实现高性能、灵活性和成本效益。FPGA 设计师使用硬件描述语言(HDL)来创建直接映射到 FPGA 架构的定制电路。由于 FPGA 工程和验证与嵌入式软件开发有显著不同,它在嵌入式系统中是一个专门的领域。


编程基础

掌握编程基础和软件开发原则是成功进行嵌入式设计的关键。嵌入式系统需要高效的代码、优化的数据管理、可复用的设计模式以及有效的内存管理,以便在资源受限的环境中正常运行。嵌入式开发人员必须拥有这些核心概念的坚实基础,才能创建可靠且高性能的嵌入式系统。

算法和数据结构

设计模式

状态机

内存管理


编程语言

低级语言如 C 和汇编语言提供直接的硬件访问,使得资源受限的嵌入式系统能够进行高效的代码优化。系统级语言如 C++ 和 Rust 为复杂的嵌入式应用程序提供了更高的抽象层次,而 Python 则因其简单性常用于测试嵌入式系统。

C

C++

汇编

Python

MicroPython

Rust

Zig


微控制器

微控制器是集成电路(IC),将微处理器、内存和输入 / 输出(I/O)外设集成在单个芯片上。它们设计用于嵌入式应用,用于在各种行业中控制设备,包括汽车、工业、消费电子和医疗保健。

一些流行的微控制器系列包括 AVR、PIC、STM32、MSP430、nRF 和 ESP32。选择合适的微控制器需要评估应用需求、处理能力、内存需求和输入 / 输出能力。此外,还需考虑易用性、成本、可靠性、可用性和未来扩展性。

GPIO

模数转换 ADC

数模转换 DAC

定时器 / 计数器

脉宽调制 PWM

实时时钟 RTC

看门狗 Watchdog

中断 Interrupts

直接内存访问 DMA

时钟管理

电源管理

Bootloader / DFU 设备固件更新


接口、协议与通信技术

嵌入式系统通常通过接口和协议与其他设备或外部系统进行通信。接口提供物理连接,协议定义数据交换规则。选择取决于具体应用需求,包括带宽、距离、安全性和功耗。

基础协议

UART

I2C

SPI

SDIO

I3C

1-Wire

数字音频协议

I2S

PCM

显示与相机协议

MIPI CSI-2

MIPI DSI

HDMI

无线通信协议

Bluetooth / BLE

Wi-Fi

LoRa / LoRaWAN

Zigbee

Thread

Matter

工业通信协议

Modbus

RS485

EtherCAT

CoAP & MQTT

高速协议

以太网 Ethernet

USB

PCIe

汽车通信协议

CAN

网络协议 / 套接字编程

蜂窝通信

GSM / LTE

LTE-M & NB-IoT


存储技术与文件系统

嵌入式系统根据性能、成本、功耗和耐用性等因素,使用易失(SRAM、DRAM、PSRAM)和非易失(闪存、EEPROM、FRAM)存储器来存储和访问数据。

Flash Memory

NOR / NAND

eMMC

SD 卡

EEPROM

SRAM / DRAM

文件系统

文件系统是在存储设备(如硬盘驱动器、闪存驱动器或固态驱动器)上组织数据的一种方式。它提供了一种存储、访问和管理文件的方法,文件是可以单独访问的数据集合。嵌入式系统中的文件系统通常是轻量级的,并且针对效率进行了优化,考虑到了嵌入式设备的有限资源和特定需求。与桌面或服务器文件系统相比,它们通常使用更简单的文件结构和数据结构。


硬件仿真 / 模拟

嵌入式系统开发通常涉及在实际硬件部署之前模拟或仿真硬件环境,以测试和调试软件。仿真工具创建硬件系统的虚拟模型,而模拟工具则使用真实的硬件组件复制实际的硬件行为。这些工具提供了多种优势,包括减少开发时间、降低硬件成本和提高软件可靠性。

QEMU

Renode


传感器与执行器

传感器与执行器是嵌入式系统的眼睛和手。它们负责收集环境信息并基于这些信息采取行动。传感器将温度、光或声音等物理现象转换为嵌入式系统可以处理的电信号。而执行器则将电信号转换为物理动作,例如控制电机速度或开关阀门。

传感器

执行器


数字信号处理 DSP

数字信号处理(DSP)是处理数字信号的工程学分支。它广泛应用于嵌入式系统、通信系统和多媒体系统中。DSP算法通常使用专用集成电路(ASIC)或现场可编程门阵列(FPGA)在硬件中实现。

DSP 基础与滤波器设计

离散傅里叶变换 / 快速傅里叶变换 (FFT)

控制理论

PID 控制器


操作系统

嵌入式系统可以使用操作系统(OS)编程,或者直接在硬件上编程,即裸机编程。每种方法都有其优点和缺点。嵌入式操作系统在硬件和应用代码之间提供了一个抽象层,提供资源管理、任务调度、错误处理和通信能力等优势。然而,它们增加了开销,可能不适合内存受限的应用。

操作系统基础

实时操作系统

实时操作系统(RTOS)是为满足严格时间期限而设计的专用操作系统。它们用于对时间要求苛刻的嵌入式系统中,如航空电子设备、机器人和医疗设备。RTOS 提供了一个确定性的环境,使任务能够以可预测的时间执行。这确保了关键任务即使在中断和其他干扰的情况下也能按时执行。

RTOS 基础

FreeRTOS

Zephyr

μC/OS / Micriμm OS

NuttX

RT-Thread

Mbed OS

QNX

VxWorks

Azure RTOS (ThreadX)

嵌入式 Linux

嵌入式 Linux 是针对嵌入式系统定制的专用 Linux 操作系统。它旨在运行于资源受限的设备上,如内存、处理能力和功耗有限的设备。

Linux 内核

Linux 设备驱动程序

U-Boot

Buildroot

Yocto

多线程与并行处理

高性能计算 HPC

进程间通信 IPC

Qt 框架


调试

调试嵌入式系统涉及识别和解决软件缺陷和硬件故障。使用的技术包括静态代码分析、动态分析、仿真和模拟、在电路调试以及硬件调试。

JTAG / SWD

JTAG 和 SWD(串行线调试)是两种常用的嵌入式系统调试和编程接口协议。JTAG 是一种更通用的协议,适用于调试和编程更多类型的设备,而 SWD 则是专为 ARM 微控制器设计的更简单且紧凑的协议。

GDB

GDB(GNU 调试器)是一款功能强大且多用途的调试器,支持源代码级和机器级调试。它支持多种编程语言,包括 C、C++、Objective-C、Java 和 Rust。GDB 是一款被广泛使用的免费开源软件工具。

OpenOCD

OpenOCD(开放片上调试器)是一款开源软件工具,为嵌入式系统的调试和编程提供了强大且多功能的平台。它作为硬件调试适配器(HDA)与调试器(如 GDB)之间的接口,使开发人员能够与目标微控制器或微处理器进行交互。OpenOCD 支持多种硬件平台,并提供全面的硬件调试、编程和边界扫描测试功能。


构建系统

构建系统自动化地将源代码编译和链接为可执行程序。它们是软件开发中的重要工具,可以帮助提高构建过程的效率和一致性。常用的构建系统包括 Make 和 CMake。

编译器 / GCC

GCC(GNU 编译器套件)是一个免费开源的编译系统,能够编译多种编程语言的程序,包括 C、C++、Objective-C、Fortran、Ada 和 Go。由于其开源性质、成熟度、稳定性、可移植性、性能和庞大的社区支持,GCC 在嵌入式系统开发中非常受欢迎。另一方面,像 Keil 和 IAR 这样的专有编译器提供工具链支持、目标特定优化和客户支持,可能在特定项目中更受青睐。

Make / CMake

CMake 和 Make 都是用于构建软件应用的工具。CMake 是一个生成 Makefile 的元构建系统,这些 Makefile 随后由 Make 用于构建软件。CMake 比 Make 更通用且跨平台,它在现代软件开发中正变得越来越受欢迎。

Bash 脚本

Bash 脚本在嵌入式系统开发中是一个强大的工具,可以使开发人员自动化重复任务、处理复杂配置以及有效管理嵌入式系统的环境。Bash 脚本是针对 Linux 的工具,未在 Windows 中本机集成,但可以通过 Windows 子系统 Linux(WSL)访问。

Docker

Docker 容器提供了一种一致且隔离的环境来构建软件应用。这有助于提高构建的可重现性并减少错误风险。Docker 还使共享构建环境更加容易,从而为开发人员节省时间和精力。


软件开发生命周期(SDLC)模型

软件开发生命周期(SDLC)模型为软件开发提供了一种结构化的方法,指导从规划到部署和维护的整个过程。这些模型提供了组织、管理和执行软件项目的框架,确保开发过程的一致性和高效性。

敏捷 / SCRUM

V-Model


版本控制

版本控制系统是管理代码和其他数字资产更改的基本工具。它们跟踪随时间的变化,使开发人员可以恢复到先前版本、有效协作并识别潜在冲突。流行的版本控制系统包括 Git、Mercurial 和 Subversion。

Git

SVN


测试

测试是嵌入式系统开发过程的核心部分,确保系统的质量、可靠性和安全性。它涉及从单元测试到系统测试的各种技术,用于验证软件和硬件组件的功能和性能。

TDD 测试驱动开发

单元测试

集成测试

CI/CD

持续集成(CI)和持续交付(CD)是自动化构建、测试和部署软件的开发实践。CI/CD 流水线旨在确保软件更改能够快速且可靠地部署。

SIL / HIL 测试

软件在环(SIL)和硬件在环(HIL)测试是嵌入式系统开发中用于验证软件功能和性能的两种关键技术。这些测试方法使用软件模型或硬件仿真器模拟嵌入式系统的真实环境。

标准与认证

嵌入式系统开发需要遵循各种标准与认证,这些标准和认证作为确保系统质量、安全性和可靠性的指南和基准。这些标准通常由行业机构制定和维护,例如国际电工委员会(IEC)和汽车工程师学会(SAE)。

功能安全


嵌入式安全

由于资源限制和设备本身的特性,嵌入式系统中的安全性特别具有挑战性。嵌入式系统通常运行在小型、低功耗的微控制器上,内存和处理能力有限。这使得实现与传统计算平台相同级别的安全性变得困难。此外,嵌入式系统通常难以获得更新和补丁,使其更容易受到已知漏洞的攻击。

硬件破解

学习硬件破解有助于安全专业人员了解嵌入式系统如何被攻破,并制定有效的防御措施以防止网络攻击。这些知识增强了嵌入式设备抵御攻击的能力。

加密技术

安全启动与安全固件更新


嵌入式图形用户界面

图形用户界面(GUI)已成为现代嵌入式系统不可或缺的一部分,提供了一种用户友好且直观的设备交互方式。设计有效的嵌入式系统 GUI 需要仔细考虑资源限制、用户体验和实时性能等因素。


物联网

物联网(IoT)指的是由互联设备组成的网络,这些设备收集并与其他设备或云端交换数据。嵌入式系统通常是 IoT 设备的“大脑”,负责管理数据收集、处理和通信任务。嵌入式系统设计成在有限的功率和资源下运行,非常适合 IoT 应用。

增量 OTA 固件更新


边缘 AI

边缘 AI 指设备能够自行执行机器学习任务,而无需将数据发送到中央服务器。这可以通过将小型、专用的AI模型直接嵌入设备中来实现。TinyML 是边缘 AI 的一个子集,专注于为计算能力非常有限的设备(如微控制器和传感器)开发这些模型。

AI & ML 基础

TensorFlow Lite

TinyML


AUTOSAR 架构

AUTOSAR,即汽车开放系统架构,是全球汽车软件开发的行业标准。这是一种软件架构,为开发和集成车辆电子控制单元(ECU)中的软件组件提供了一个标准化平台。这使来自不同制造商的不同 ECU 够无缝地通信和协同工作。


历史

起初,这只是我的个人阅读清单,但随着清单逐渐变得越来越大,我想为什么不与他人分享呢?于是我对当前嵌入式工程职位的招聘信息进行了研究,选择了最常见的技能并将它们包含在一个路线图中。为了使路线图更全面,我还添加了一些基本技能,最终构成了你现在看到的内容。

创建这个路线图的想法来自 vazeri / Embedded-Engineering-RoadMap-2018,它设计得很好但有一些缺陷且多年未更新。我借鉴了这个想法,改变了路线图的结构并尝试改进它。初始成果可以在 m3y54m / Embedded-Engineering-Roadmap-Archived 访问,该项目现已存档。早期版本的路线图是使用 Balsamiq Wireframes 创建的,这种工具不适合此类图表。因此,我决定改用 Microsoft Visio 并重新绘制了整个图表。

版权

本作品采用 知识共享署名 - 相同方式共享 4.0 国际许可协议 进行许可,这意味着你可以在以下条款下分享或改编本作品:

  • 署名 — 你必须给出适当的署名,提供许可协议链接,并说明是否对作品进行了修改。你可以以合理的方式进行,但不可暗示许可人认可你或你的使用。

  • 相同方式共享 — 如果你再混合、转换或基于本作品进行创作,必须在相同的许可协议下分发你的贡献作品。

致谢

特别感谢 Twitter 上伊朗嵌入式工程师社区的朋友们和 r/embedded 子版块的成员们,他们的建议帮助改进了这个路线图。

贡献

如果你认为这个路线图可以以任何方式改进,或者你知道一些可以添加的良好学习资源,请提出问题或请求合并(pull request)。我将频繁维护和更新此仓库。

源文件是使用 Microsoft Visio 以 .vsdx 格式创建的,并包含在此仓库中以供你贡献。如果你没有 Microsoft Visio 或你想使用免费软件,你可以使用 draw.io,它能够导入和导出 .vsdx 文件。

相关文章

Leehyon HNG

作者

Leehyon HNG

嵌入式软件工程师,安徽歙县人。躺不平的不想打工者,爱自由也拥抱规则,生命不止,折腾不休。在 GitHub 关注我,或在 Mastodon了解更多。