跳转到内容
← 返回核心概念
系统与架构计算机科学 · 系统工程13 分钟阅读

嵌入式系统

Embedded Systems

你口袋里的手机是一台通用计算机。但打开洗碗机的控制面板,里面那块芯片永远只做一件事:控制洗碗程序。这就是嵌入式系统(Embedded System)——专门为特定任务而设计、集成到更大设备中的计算系统。 嵌入式系统无处不在,却几乎不被感知。一辆现代汽车通常装有 70 到 100 个独立的嵌入式处理器(ECU,电子控制单…

嵌入式实时系统微控制器物联网

你口袋里的手机是一台通用计算机。但打开洗碗机的控制面板,里面那块芯片永远只做一件事:控制洗碗程序。这就是嵌入式系统(Embedded System)——专门为特定任务而设计、集成到更大设备中的计算系统

嵌入式系统无处不在,却几乎不被感知。一辆现代汽车通常装有 70 到 100 个独立的嵌入式处理器(ECU,电子控制单元),高端车型(如宝马 7 系)超过 150 个,分别控制发动机、刹车、车窗、娱乐系统……

这些 ECU 协同运行的软件已达约 1 亿行代码,是波音 787 航电系统(约 650 万行)的十多倍。换句话说,今天一辆量产车的软件规模,远超人们印象中"高科技"的飞机——只是它把这种复杂度藏得很好。

破除误解:嵌入式不等于低端

"嵌入式"常被联想到简单的 8 位微控制器和 LED 小灯。实际上:

  • 智能手机的基带处理器(处理通信协议)是高度复杂的嵌入式系统
  • 波音 787 的航电系统运行约 650 万行代码(不含机上娱乐与商用现成处理器)
  • 特斯拉的自动驾驶计算平台包含多个高性能 SoC(系统级芯片)

嵌入式系统的特点不是"低端",而是专用性(针对特定任务优化)和约束性(对资源、功耗、成本、可靠性有严格要求)。

核心:微控制器与微处理器的区别

微处理器(Microprocessor,MPU):只是处理器核心,需要外接 RAM、ROM、外设接口。适合高性能通用计算(个人电脑、服务器)。

微控制器(Microcontroller,MCU):把处理器核心、RAM、Flash(程序存储)、外设接口(GPIO、UART、SPI、I2C、ADC……)集成在一块芯片上。成本低(几分钱到几十元),功耗低(微安到毫安级),适合嵌入式应用。

SoC(System-on-Chip,系统级芯片):在单芯片上集成 CPU、GPU、内存控制器、各类外设、甚至神经网络加速器。手机的应用处理器(如苹果 A 系列、高通骁龙)是典型 SoC。

常见嵌入式处理器架构: - ARM Cortex-M 系列:主流 32 位 MCU 架构,用于工业控制、消费电子、物联网(STM32、Nordic nRF 系列) - RISC-V:开源指令集架构(2010 年由加州大学伯克利分校发起),无需授权费,在物联网和边缘计算快速渗透;据 SHD Group 等机构估计,RISC-V 核年出货已接近 25 亿 - AVR / PIC:经典 8 位 MCU,Arduino 平台使用 AVR,用于教育和 DIY

这些芯片的出货量是天文数字。Arm 公开数据显示,其合作伙伴累计出货已超过 2500 亿颗芯片(截至 2023 年),其中面向 MCU 的 Cortex-M 占每年出货量约四分之三——仅 2020 年第四季度,单季就售出约 44 亿颗 Cortex-M 微控制器。你看不见它们,是因为它们藏在每一个开关、传感器和电源适配器里。

嵌入式软件的特殊性

嵌入式程序直接运行在硬件上(裸机程序)或在精简的 RTOS(实时操作系统)上运行,与桌面/服务器开发存在根本差异:

资源极其有限: - Flash(程序存储)可能只有 16KB 到 1MB - RAM 可能只有 2KB 到 256KB - 没有虚拟内存,没有动态内存分配的奢侈(malloc 在嵌入式中被视为危险的)

无操作系统或精简 RTOS: - 裸机(Bare Metal):直接操作寄存器,用中断处理异步事件 - FreeRTOS:最广泛使用的嵌入式 RTOS,提供任务调度、信号量、消息队列 - Zephyr:Linux 基金会维护的现代嵌入式 RTOS,原生支持物联网安全

启动流程:嵌入式系统上电后执行固定位置(Flash 起始地址)的启动代码(Bootloader),初始化硬件,然后跳转到主程序。失败则……永远卡住,没有错误弹窗。

C 语言统治:虽然 Rust 正在嵌入式领域获得关注(内存安全无运行时开销),C 语言仍是嵌入式的主导语言——因为工具链成熟、对硬件的精细控制以及庞大的历史代码库。

外设接口:嵌入式的"感官"

嵌入式系统通过外设接口与物理世界交互:

接口特点典型应用
GPIO(通用输入输出)最简单,单 bit 读写按键、LED、继电器控制
ADC(模数转换器)读取模拟量(连续信号)温度传感器、电压测量
PWM(脉宽调制)用数字信号模拟模拟量电机速度控制、LED 亮度
UART串口通信,简单点对点调试终端、GPS 模块
SPI同步串口,高速,主从显示屏、Flash 芯片、传感器
I2C两线串口,多设备共享加速度计、气压传感器
CAN 总线车载网络标准,抗噪强汽车 ECU 间通信

物联网(IoT):嵌入式的新浪潮

2010 年代,廉价 Wi-Fi/蓝牙模块(ESP8266、ESP32)的出现让"连网嵌入式"成本降至几美元,催生了物联网(Internet of Things)浪潮:智能音箱、智能家电、工业传感器、城市基础设施监控……

但 IoT 也带来了严峻的安全问题: - 大量 IoT 设备使用默认密码或无密码 - 固件更新机制不完善,漏洞难以修复 - 2016 年,Mirai 僵尸网络峰值感染超过 60 万台 IoT 摄像头、路由器等设备;同年 10 月 21 日,其中约 10 万台向 Dyn DNS 服务发起创纪录的 DDoS 攻击(峰值约 1.2 Tbps),导致 Twitter、Netflix、Reddit 等大量网站断网数小时。Mirai 的攻击手段简单得令人不安:扫描公网设备,用一张几十条默认用户名/密码的字典逐个尝试登录

当软件出错:嵌入式的安全代价

嵌入式软件的缺陷不会弹出蓝屏让你重启,而可能直接作用于物理世界。两个被反复研究的案例说明了为什么前文那些"看似偏执"的约束(禁用 malloc、看门狗、WCET 证明)并非杞人忧天。

丰田"意外加速"案(2013):2013 年 10 月,美国俄克拉荷马州一桩诉讼(Bookout 诉丰田)的陪审团裁定,丰田的发动机控制软件存在缺陷,构成"罔顾后果"(reckless disregard),判给两名受害者每人 150 万美元补偿性赔偿。

受聘的嵌入式专家 Michael Barr 在分析中指出多项问题:丰田对栈(stack,函数调用所用的内存)的用量分析严重失真,漏算了通过指针发起的调用、库函数与任务切换的开销;看门狗(watchdog,定时检测程序是否卡死的机制)只由一个定时中断"喂狗",无法真正检测关键任务的死亡。Barr 推断,一个被称为"Task X"、掌管节气门与多重故障保护的任务一旦"死亡",油门就可能失控。这正是"malloc 在嵌入式中被视为危险"背后的现实:内存与栈的不确定性,在安全关键系统里可能致命。

Therac-25 放射治疗机(1985–1987):这台计算机控制的放疗设备曾至少六次对患者施加远超治疗剂量的辐射,造成重伤与死亡。根本原因是一个竞态条件(race condition,多个操作时序交错导致非预期结果):当操作员快速改动参数时,软件会绕过安全检查,在没有挡靶的情况下打出高能电子束。与前代机型不同,Therac-25 取消了硬件联锁,把安全完全交给软件。软件安全研究者 Nancy Leveson 与 Clark Turner 在 1993 年的权威调查中总结:事故源于软件错误,更源于厂商缺乏规范的软件工程实践,以及对软件可靠性的盲目自信。

这两个案例把嵌入式与安全工程软件验证乃至法律责任连在一起,也解释了为什么飞行、汽车、医疗领域的认证如此严苛。

代价与争议

安全与更新困境:嵌入式设备生命周期可能长达 10-20 年(工业设备、医疗器械)。开发者往往不为长期安全支持设计,导致大量"僵尸设备"长期带着已知漏洞运行,无法修复。固件签名验证和安全启动(Secure Boot)是缓解方案,但需要在设计阶段就纳入考量。

实时性与安全性的张力:实时系统的核心指标是最坏执行时间(WCET,Worst-Case Execution Time)——一段代码在给定硬件、任意输入下可能花费的最长时间。硬实时系统必须能证明 WCET 不超过截止期,否则错过时限的后果可能与算错结果一样严重(想想汽车 ABS 防抱死刹车)。

安全关键系统(飞行控制、汽车、医疗器械)既要满足这种时序保证,又要通过严格的功能安全认证:航空领域有 DO-178C(按失效后果分 DAL A 到 E 五级),汽车领域有 ISO 26262(脱胎于通用功能安全标准 IEC 61508,按风险分 ASIL A 到 D 四级),最高等级要求近乎穷尽的测试、代码审查与文档。此外还有专门针对网络攻击的安全标准(如工业控制的 IEC 62443),与功能安全是两套并行的体系。这种多重约束使开发周期极长、成本极高。

Rust 的崛起与 C 的固守:Rust 提供内存安全保证且无运行时开销,理论上是嵌入式开发的理想语言。然而工具链成熟度、工程师培训成本、认证工具的缺失,使嵌入式领域的语言迁移极其缓慢。

跨域连接

  • 实时系统:硬实时的正确性含时间维度:算对了但错过截止期,后果与算错相同。这就要求最坏执行时间可被证明有上界,于是动态内存分配、无界循环、难以预测的缓存行为都被排除——约束不是保守,而是可证明性的代价。而这笔代价随系统规模上升得比功能复杂度更快,认证成本因此高得惊人。
  • 沙利度胺事件:医疗器械与药品的审批制度都是被事故倒逼出来的,核心变化是举证责任反转:从"出事后追责"改成"上市前须证明安全"。可检验推论:这类制度抬高的是准入门槛,并不直接提升单个产品的技术上限。
  • 公共政策:功能安全标准按失效后果分级,而不按技术难度分级。同一段代码放进刹车系统和放进车窗控制,要接受的验证强度完全不同——"该多严格"因此从工程口味变成可裁定的问题,也变成可审计的成本项。推论是:同一份代码换个用途就要重新认证,复用带来的省钱远比想象中少。
  • 时间贴现:设备寿命可达一二十年,而厂商的收益在售出时落袋,安全维护的成本要很久以后才发生。贴现之后这笔成本近乎为零,于是带着已知漏洞长期运行的"僵尸设备"是激励的必然产物,不是个别疏忽。
  • 风险感知与决策:取消硬件联锁、把安全全交给软件,前提是相信软件比机械更可靠。但两者失效模式不同:机械会磨损、可预测,软件不磨损却能在某个特定时序下瞬间失效。用机械的故障率经验外推软件,是这类事故的共同根源。推论是:删掉一道机械冗余,等于把全部风险押在软件规格的完备性上。

参考文献

  • Leveson, N. G. & Turner, C. S. "An Investigation of the Therac-25 Accidents." IEEE Computer, 26(7): 18–41, 1993. (软件安全研究的奠基性调查)
  • Wilhelm, R. et al. "The Worst-Case Execution-Time Problem—Overview of Methods and Survey of Tools." ACM Transactions on Embedded Computing Systems, 7(3), 2008. (WCET 分析方法综述)
  • Barr, M. Bookout v. Toyota Motor Corp. 专家证词,俄克拉荷马县地区法院,2013. (丰田 ETCS 固件分析一手材料)
  • ISO 26262:2018, Road vehicles — Functional safety. International Organization for Standardization. (汽车功能安全标准,定义 ASIL 等级)
  • Labrosse, J. MicroC/OS-II: The Real-Time Kernel. CMP Books, 2002. (经典 RTOS 教材)

延伸阅读

  • Barr, M. & Massa, A. Programming Embedded Systems. 2nd ed. O'Reilly, 2006.
  • White, E. Making Embedded Systems. O'Reilly, 2011.
  • FreeRTOS 官方文档. freertos.org (实践参考)