2. 嵌入式系统硬件架构:处理器架构、存储器与总线

嵌入式系统的硬件,说白了就是一块精心裁剪的“计算拼图”。处理器是大脑,存储器是记事本,总线是神经。这三样东西怎么搭,直接决定了你的系统能跑多快、能省多少电、能扛多大活儿。我这些年调过的板子,十有八九的问题都出在这三者的匹配上。

2.1 处理器架构:ARM 与 RISC-V

处理器架构是嵌入式世界的“方言”。目前最主流的两大门派,就是 ARM 和 RISC-V。ARM 是老牌劲旅,RISC-V 是开源新贵。咱们一个一个说。

2.1.1 ARM 架构:生态的王者

ARM 采用精简指令集(RISC),特点是指令长度固定、寻址方式简单。它不生产芯片,只卖“设计图纸”(IP 核)。你买到的 STM32、NXP i.MX、TI AM335x,里面跑的都是 ARM 内核。

ARM 家族里,你最常见的是这几个系列:

系列 典型内核 应用场景 我的经验
Cortex-M M0/M3/M4/M7 单片机、实时控制 M3 是万金油,M4 带 DSP 和 FPU,做电机控制很顺手
Cortex-R R4/R5 实时性要求高的场景(汽车、硬盘控制器) 我做过一个 R5 的刹车控制项目,中断响应确实快
Cortex-A A7/A53/A72 应用处理器(Linux、Android) A7 做低功耗 Linux 网关很划算

ARM 最大的优势是生态。你遇到问题,网上随便一搜就有答案。编译器、调试器、RTOS 支持,全给你配齐了。但代价是授权费不便宜,而且你没法改指令集。

我的习惯: 做低功耗电池设备,优先选 Cortex-M0+。做需要跑算法或操作系统的,直接上 Cortex-M7 或 A 系列。别在 M3 上硬跑复杂算法,那是跟自己过不去。

2.1.2 RISC-V:开源的未来

RISC-V 是加州大学伯克利分校搞出来的开源指令集架构。它不收费,你可以随便改、随便加自定义指令。这对很多公司来说,吸引力太大了。

RISC-V 的核心里,目前比较成熟的有:

  • RV32I:基础整数指令集,相当于 RISC-V 的“最小公倍数”
  • RV32IM:加了乘除法指令
  • RV32IMC:再加压缩指令,代码密度更高
  • RV32IMF:带单精度浮点

我去年帮一个客户评估过 RISC-V 方案。说实话,工具链和调试器还没 ARM 那么成熟,但胜在灵活。他们自己加了一条硬件加速指令,把 AES 加密速度提了 3 倍。这在 ARM 上基本不可能。

避坑指南: 我曾经在一个 RISC-V 项目上踩过坑——某款芯片的 BSP 里,中断控制器实现跟标准规范有出入,导致 FreeRTOS 移植时出了诡异的问题。所以选 RISC-V 芯片,一定要确认好生态成熟度,尤其是 RTOS 和调试器的支持情况。

2.2 存储器层次结构:速度与容量的博弈

嵌入式系统里,存储器不是“一块”东西,而是一个金字塔结构。越往上越快、越贵、越小;越往下越慢、越便宜、越大。

嵌入式存储器层次结构 寄存器 (Register) Cache (SRAM) 主存 (SDRAM / DDR) 非易失存储 (Flash / EEPROM) 大容量存储 (SD卡 / eMMC / NAND) 速度 ↑ 快 ↓ 慢 容量 ↑ 大

这张图你得多看几遍。我见过不少新手,把大数组直接定义在栈上,结果栈溢出。或者把频繁更新的变量放在 Flash 里,导致程序跑飞。说白了,你得知道你的数据该放哪一层。

2.2.1 寄存器与 Cache

寄存器是 CPU 内部最快的存储,一个时钟周期就能读写。但数量极少,一般几十个。Cache 是 SRAM,速度比主存快 5-10 倍。Cortex-M3/M4 通常没有 Cache,但 M7 有 L1 Cache。

关键点: 在带 Cache 的芯片上做实时控制,要小心 Cache 一致性问题。我曾经在 M7 上做 DMA 传输,忘了做 Cache 刷新,结果 DMA 写进来的数据 CPU 读到的全是旧值。排查了整整两天。

2.2.2 主存与 Flash

主存(SDRAM/DDR)是程序运行的地方,掉电丢失。Flash 是存代码和固件的地方,掉电不丢。选型时要注意:

  • Flash 容量:至少留 30% 余量,给后续升级用
  • RAM 容量:算好堆栈、全局变量、DMA 缓冲区的总和
  • 读写速度:Flash 读快写慢,别在 Flash 里频繁写日志

2.3 总线与接口:数据流动的血管

总线就是处理器跟外设之间的“高速公路”。嵌入式系统里,最常用的总线就这几条。

2.3.1 内部总线:AMBA 与 AHB/APB

ARM 芯片内部用的是 AMBA 总线协议。高性能外设(DMA、以太网)挂 AHB,低速外设(UART、GPIO、I2C)挂 APB。这样设计的好处是:高速设备不堵低速设备的车。

我调试过一个音频项目,I2S 接口挂在 APB 上,结果音频数据流一上来,APB 总线就堵死了。后来改挂到 AHB 上,问题解决。所以,总线选错了,性能直接腰斩。

2.3.2 外部接口:UART、I2C、SPI、CAN

接口 速度 线数 典型用途 我的建议
UART ~1 Mbps 2 (TX/RX) 调试日志、GPS、蓝牙模块 调试口一定要留,救命用的
I2C ~3.4 Mbps 2 (SCL/SDA) 传感器、EEPROM、RTC 注意上拉电阻,别省
SPI ~50 Mbps 4 (SCK/MOSI/MISO/CS) 显示屏、ADC、SD卡 全双工,速度快,但线多
CAN ~1 Mbps 2 (CANH/CANL) 汽车、工业控制 差分信号,抗干扰强
避坑指南: 我曾经在一个 I2C 项目上,因为上拉电阻选得太小(100Ω),导致总线拉不低,通信全乱。后来换成 4.7kΩ,一切正常。I2C 上拉电阻一般选 2kΩ~10kΩ,具体看总线电容和速度。

2.3.3 高速接口:USB、Ethernet、SDIO

这些接口速度高,但实现复杂。USB 有主机和设备两种模式,Ethernet 需要 MAC+PHY 两层,SDIO 用来接 SD 卡或 WiFi 模块。做这些接口时,信号完整性是重中之重。差分线要等长,阻抗要匹配,地平面要完整。

我记得调试一个 USB 高速设备时,因为 PCB 走线没做阻抗控制,USB 一直枚举失败。后来在走线上加了 22Ω 的串联电阻,才稳定下来。嗯,高频信号就是这么敏感。

2.4 本章小结