@freeCodeCamp: 如今我们使用各种智能设备,从冰箱和咖啡机到健身追踪器和ATM机。在这本手册中…
摘要
这本手册向开发者教授嵌入式系统固件基础知识,涵盖硬件、软件、内存管理和创建智能设备的工具。
查看缓存全文
缓存时间: 2026/09/15 05:43
如今我们使用各种智能设备,从冰箱和咖啡机到健身追踪器和ATM机。
在这本手册中,@sohamstars 将为你详细讲解驱动这些设备的软件知识。
你还将了解硬件的工作原理、内存与电源管理、时序控制与通信机制等更多内容。
https://freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/…
学习嵌入式系统固件基础——开发者指南
来源:https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/
你是否曾好奇冰箱如何知道何时制冷,咖啡机如何知道何时停止冲泡?这些设备背后都由嵌入式系统驱动——它们是专门设计用于可靠高效执行特定任务的小型专用计算机。
嵌入式系统通常遵循一个简单而强大的循环流程:
- 感知——通过传感器收集环境信息
- 处理——运用软件逻辑决定如何处理数据
- 执行——触发响应动作,如启动电机或点亮LED
每个项目都始于具体用例——例如冲泡咖啡或控制汽车燃油喷射等明确目标。基于此,工程师们定义系统需求,并将其划分为:
- 硬件(如微控制器、传感器、执行器)
- 软件(即我们所说的嵌入式软件)
本手册重点关注嵌入式系统的软件层面:如何编写代码使嵌入式系统变得智能。嵌入式软件运行在资源受限的设备(如微控制器)上,这类设备可能仅有几千字节内存。软件需要高度高效、可靠,并且通常具备实时工作能力。
但嵌入式软件不仅是编写代码——还需要理解:
- 硬件工作原理
- 内存与电源管理方法
- 时序处理与通信机制
- 如何构建稳健的故障安全系统
虽然嵌入式系统开发在多数行业岗位中并非以研究为主导,但它要求广泛的技术能力,从底层编程到系统级设计。这个领域尤其令人兴奋之处在于它融合了机器学习、数字信号处理(DSP)和控制系统等多个不同领域,这些技术都能直接应用于现实设备。
在本文中,我将为你提供:
- 嵌入式软件涉及的高层概述
- 每位开发者应掌握的关键概念
- 常用工具和框架介绍
- 帮助你学习理解基础知识的资源
无论你是出于好奇还是规划嵌入式系统职业道路,本指南都将成为你的起点。
目录
- 硬件层:微控制器(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-hw-layer-microcontroller)
- 固件设计与工具(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-firmware-design-and-tools)
- 嵌入式开发工具与概念(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-tools-and-concepts-for-embedded-development)
- 裸机、RTOS与嵌入式操作系统(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-bare-metal-rtos-and-embedded-operating-systems)
- 嵌入式系统驱动设计(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-designing-drivers-for-embedded-systems)
- 嵌入式系统安全(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-security-in-embedded-systems)
- 嵌入式系统调试与取证(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-debugging-and-forensics-in-embedded-systems)
- 嵌入式系统自动化与测试(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-automation-and-testing-in-embedded-systems)
- 进阶学习路径(https://www.freecodecamp.org/news/learn-embedded-systems-firmware-basics-handbook-for-devs/#heading-where-to-go-from-here)
本文提供了嵌入式固件开发的宏观概述,但未涵盖所有方面,特别是高级软件架构框架或开源软件工具的完整列表。在适当之处,我收录了对扩展自身理解很有帮助的外部资源。
前置知识
无需成为专家也能理解本指南,但具备以下基础知识将帮助你更好地吸收内容:
- 基础C或C++编程:熟悉函数、指针和内存概念会有帮助
- 计算机体系结构基础:理解CPU功能、内存工作方式和基本指令执行流程,能使嵌入式概念更清晰
- 电子学基础(可选):了解传感器、电阻或微控制器在电路层面的交互方式很有用,但非必需
- 命令行操作能力:尤其在使用构建系统、编译器和烧录工具时
本指南非常适合希望深入了解软件在现实系统中如何与硬件交互的学生、工程师或爱好者。
现在,让我们从硬件基础开始。在本指南中,大多数示例将以ARM Cortex-M微控制器为参考,因为它们在嵌入式领域应用最为广泛。
硬件层:微控制器
理解微控制器(MCU)的工作原理及其与传感器、执行器和其他微控制器的连接方式,是嵌入式固件开发的重要知识模块。
如果你熟悉基础计算机体系结构(如指令集和内存组织),这些知识在嵌入式系统中同样适用。实际上,计算机科学和电气工程专业常讲授的《计算机系统组成》课程,是理解微控制器的绝佳基础。
什么是微控制器?
微控制器是紧凑的计算单元,包含:
- CPU(中央处理器或微处理器)
- 内存(Flash和RAM)
- 外设(用于输入/输出、定时、通信等)
本质上,它是单芯片上的微型计算机,专为特定控制任务(如读取传感器或驱动电机)而优化。
相比之下,微处理器仅包含CPU,需要外部内存和外设才能工作。微控制器是自包含的,更适合嵌入式应用。
例如,STM32F4系列(来自意法半导体)的参考手册(https://www.st.com/resource/en/reference_manual/dm00031020-stm32f405-415-stm32f407-417-stm32f427-437-and-stm32f429-439-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf)不仅详细介绍了CPU,还提供了每个外设的功能说明和寄存器映射。
指令集架构(ISA)
微处理器执行由指令集架构(ISA)定义的一系列指令。ARM(https://www.arm.com/glossary/isa)定义的ISA是计算机抽象模型的一部分,规定了CPU如何由软件控制。ISA作为硬件与软件之间的接口,既定义了处理器的功能能力,也规定了实现方式。
例如:
- ARMv7 – 用于ARM Cortex-M3
- ARMv7E – 用于Cortex-M4和M7
许多厂商(如意法半导体、恩智浦、德州仪器)生产支持ARM ISA的MCU,但各自包含不同的外设集合。理解ISA对于底层编码和汇编指令解读至关重要。
ARMv7-M架构参考手册(https://developer.arm.com/documentation/ddi0403/ee/?lang=en)提供了关于v7架构的更多细节。
微控制器内存
大多数微控制器通常包含两种内存类型:
- Flash– 存储代码和只读数据
- RAM– 程序执行时使用,用于存放:堆(动态内存)、栈、.data和.bss段(已初始化/未初始化的全局/静态变量)
后续章节将深入讲解内存映射以及这些区域在运行时的交互方式。
时钟与电源管理
微控制器是由数字逻辑器件构成:
- 组合逻辑——逻辑门即时评估输出
- 时序逻辑——依赖时钟信号推进状态
时钟树将时序信号分配到CPU和外设。MCU通常支持多种时钟源(内部RC振荡器、外部晶振、PLL),并通过预分频器为不同组件提供不同频率的时钟。
对于功耗敏感的应用,MCU提供多种低功耗模式:
- 睡眠模式– CPU关闭,定时器和外设基本保持活动,内存保持内容
- 深度睡眠模式– CPU关闭,多数时钟关闭,内存保持内容,唤醒速度比睡眠模式慢,功耗低于睡眠模式
- 待机模式– CPU关闭,仅少数中断保持活动,其他全部断电,内存内容丢失。功耗最低的模式。
这些模式通过关闭时钟和禁用未使用外设来降低功耗。设计系统以有效切换低功耗状态是嵌入式软件开发的核心技能。
本文介绍了ARM Cortex微控制器的时钟树与振荡器(https://www.playembedded.org/blog/arm-cortex-clock-tree-101/)。
中断
中断使MCU能够响应异步事件,如按键操作或传感器信号。
中断会临时暂停正常代码执行,转而运行专用处理程序。处理完成后,CPU恢复之前的任务。中断对于以下功能至关重要:
- 快速事件响应
- 减少轮询操作
- 高效利用电源(例如从睡眠模式唤醒)
定时器
定时器是用于跟踪时间或生成事件的内置外设。
常见用途包括:
- 实现软件延时
- 创建精确的软件定时器
- 从低功耗模式唤醒
掌握定时器有助于实现时序行为和精确事件调度。
通信协议
微控制器常需要通过内置通信外设与其他设备通信:
- UART(通用异步收发器):设备间的串行通信,适用于日志记录和调试
- I2C(集成电路总线):双线协议,用于与传感器和EEPROM通信
- SPI(串行外设接口):高速、全双工协议,适用于Flash或显示屏等设备
- USB(通用串行总线):复杂但广泛应用于PC、数据采集和HID设备
下图展示了多个外设连接到MCU的情况:
图中MCU通过SPI连接Flash,通过UART连接另一个MCU2,通过I2C连接温度传感器,通过USB连接主机计算机。此图展示了多个外设如何连接到主机计算机
DMA(直接内存访问)是重要外设,可在不涉及CPU的情况下传输数据到/从内存。它提升了性能,并允许CPU执行其他任务或进入低功耗模式以降低功耗。
本文(https://www.parlezvoustech.com/en/comparaison-protocoles-communication-i2c-spi-uart/)对I2C、UART和SPI通信协议进行了良好概述。
至此我们已涵盖微控制器硬件的核心构建模块——从内存和时钟到中断和通信总线。
接下来,我们将探索使这些微控制器运转的软件原理和工具,包括编译器、调试器和嵌入式开发框架。
嵌入式软件设计
尽管嵌入式系统运行在特定硬件约束下,软件设计原则仍然至关重要。当内存、CPU周期和响应能力有限时,审慎应用这些原则变得尤为重要。
大多数嵌入式固件项目从结构化设计方法开始:
- 理解问题陈述
- 列出假设条件
- 定义用例
- 定义系统和软件需求
- 创建高层架构
- 深入详细设计与实现
如果你是软件设计新手,请查看我关于设计原则的文章(https://www.freecodecamp.org/news/learn-software-design-basics/)。
下图展示了软件设计的五个组成部分:
软件设计组成:问题陈述描述问题,用例描述问题陈述适用的使用场景,之后是收集需求、创建架构和最终设计
使用设计模式
设计单个组件时,设计模式能帮助你编写可扩展且可维护的代码。以下是嵌入式系统中一些常见模式:
- 发布-订阅(观察者模式)– 有助于解耦事件生产者和消费者(例如将传感器数据广播给多个模块)
- 单例模式 – 确保模块或资源管理器只存在一个实例(例如用于驱动程序或HAL层)
- 适配器模式 – 在不兼容的接口间转换(例如将平台特定代码封装成可移植应用层)
- 状态机 – 将系统行为表示为状态间的转换(例如蓝牙状态:
空闲→扫描→连接中→已连接→已断开)
设计模式常需针对内存和时序约束进行调整,但其核心概念仍然高度适用。
关于设计模式有许多优秀资源,以下对我帮助较大:
- 书籍:《Head First 设计模式》(https://www.amazon.com/Head-First-Design-Patterns-Object-Oriented/dp/149207800X/)- 帮助理解设计模式概念的优秀读物
- 书籍:《设计模式:可复用面向对象软件的基础》(https://www.design-patterns.com/design-patterns/design-patterns-book/)
- 课程:《C#面向对象编程与设计模式》(https://www.freecodecamp.org/news/master-object-oriented-programming-and-design-patterns-in-c/)
- 分层状态机概述文章(Barr Group)(https://barrgroup.com/blog/introduction-hierarchical-state-machines)
嵌入式系统编程语言
理论上任何可编译为机器码的语言都能使用,但实际上嵌入式领域主要使用三种语言:
- C – 行业标准。提供确定性行为和底层访问能力,非常适合内存和时序敏感的代码
- C++ – 在保持控制的同时增加面向对象特性。过去因合成代码和开销问题在嵌入式中被视为高风险,现已被广泛采用以获得抽象和模块化优势
- Rust – 内存安全的替代选择,在安全关键和开源嵌入式开发中日益普及
Python等语言(通过MicroPython或CircuitPython)可用于教育或原型开发,但由于性能和内存开销不适合生产环境。
以下编程语言资源有助于理解相关概念:
- 《嵌入式Rust手册》(https://docs.rust-embedded.org/book/)
- K&R的《C程序设计语言》(https://www.freecodecamp.org/news/learn-c-programming-classic-book-dr-chuck/)
- 《深度探索C++对象模型》(https://www.google.com/aclk?sa=L&ai=DChcSEwi31JG8pvSNAxUpFa0GHX8lIoEYABAHGgJwdg&co=1&gclid=CjwKCAjw3rnCBhBxEiwArN)
相似文章
个性化硬件时代即将来临
本文认为,正如软件变得个性化一样,接下来将是硬件,通过廉价的设备和开放平台,用户可以为小型、传感器丰富的设备编写自己的软件。
嵌入式AI
David Such所著的一本综合性书籍,教授如何将AI集成到嵌入式系统中,包含超过25个实践项目和实用工程指导。
@freeCodeCamp:编写整洁代码有助于构建可扩展且可维护的软件应用。在这本手册中,@shahancd 解释了…
一本解释整洁代码原则和模式的手册,用于构建可扩展的软件,包含 JavaScript 示例。
@freeCodeCamp:软件可靠性看似是现代挑战,但工程师们解决这类问题已有很长历史。……
本文在制造业与现代软件工程的可靠性之间建立类比,重点介绍了冗余、根本原因分析和可观测性等原则,以帮助构建弹性系统。
@interlatent:硬件是人工智能与物理世界之间的桥梁。原子与比特必须协同工作,才能构建未来嵌入物理智能的系统…
一条推文讨论了硬件如何桥接人工智能与物理世界,并链接到一份关于物理智能的指南。