嵌入式系统与ARM架构详细教程(小白入门到进阶)

本文将带大家系统梳理嵌入式开发中常见的核心概念,包括 CPU/MPU/MCU/SOC/SoPC 的区别、交叉编译、ROM与RAM运行方式、冯·诺依曼与哈佛架构、ARM处理器工作模式、寄存器分类、中断与异常处理、大端小端存储、内存管理,以及启动流程等。内容从概念讲解到应用实例,适合嵌入式初学者逐步建立完整的知识框架。


CPU、MPU、MCU、SOC、SoPC

CPU

CPU(Central Processing Unit,中央处理器)是计算机的核心,负责算术运算和逻辑控制。它本质上是一台“计算和控制核心”。

MPU

MPU(Microprocessor Unit,微处理器),通常是“只带处理器,不带外设”的芯片,偏向计算密集型应用,灵活性高,需要额外配套存储器和外设。

MCU

MCU(Microcontroller Unit,单片机),把CPU、存储器(RAM/ROM)、I/O接口集成在一颗芯片上。适合低功耗、控制逻辑场景,比如家电、传感器。

SOC

SOC(System on Chip,片上系统),把CPU、GPU、DSP、存储控制器、外设接口等几乎所有计算机部件集成到单芯片上,是现代手机、平板、智能硬件的核心。

SoPC

SoPC(System on Programmable Chip),基于FPGA等可编程逻辑阵列,将软硬件功能通过编程方式灵活配置。典型代表如 Altera Nios II。


交叉编译

为什么需要交叉编译?

  • 我们的开发环境常用 Windows/Linux PC,但目标平台是 嵌入式芯片,它们的架构(如 ARM、RISC-V)不同。
  • 目标平台往往没有完整操作系统,无法直接安装编译器。
  • 解决方案就是 交叉编译:在开发主机(Host)上编译,生成能在目标机(Target)上运行的可执行程序。

举例

  • 开发环境:Windows + Linux 子系统(WSL)

  • 工具链:arm-none-eabi-gcc

  • 流程:

    1. 在 Windows/Linux 上编译代码
    2. 生成 .elf.bin 文件
    3. 通过烧录工具下载到 STM32 等开发板上运行

ROM 与 RAM 运行方式

基于 ROM 的运行

  • 代码直接存储在 Flash/ROM 中运行
  • 启动速度快
  • 但存储介质可写性差,灵活度低

基于 RAM 的运行

  • 上电后先把程序从 Flash 拷贝到 RAM
  • RAM 速度快,适合运行复杂 OS 和应用
  • 缺点:启动过程多一步拷贝,耗时增加

应用场景

  • ROM:简单控制程序、固件
  • RAM:嵌入式操作系统(RTOS、Linux)

冯·诺依曼与哈佛架构

冯·诺依曼结构

  • 指令与数据共用一条总线
  • 成本低,但 CPU 无法同时取指和取数,存在瓶颈

哈佛结构

  • 指令总线与数据总线分离
  • CPU 可以并行取指与取数,效率更高
  • 现代 MCU 常采用 改进型哈佛架构

ARM 处理器工作模式

ARM 架构有多种运行模式,用于不同场景:

  • 用户模式(User):运行普通应用程序
  • 系统模式(System):运行系统级任务
  • 管理模式(Supervisor):操作系统内核运行
  • 中断模式(IRQ/FIQ):处理中断请求
  • 异常模式(Abort/Undefined/SVC):处理错误、系统调用
  • 虚拟机模式(Hyp/Monitor):虚拟化或安全相关

ARM 寄存器分类

ARM 处理器共有 37 个寄存器(不同架构版本可能有差异):

  • 通用寄存器(R0-R12):存放数据和运算中间值
  • 栈指针 SP(R13):指向栈顶
  • 链接寄存器 LR(R14):存放函数返回地址
  • 程序计数器 PC(R15):存放下一条指令地址
  • 状态寄存器 CPSR/SPSR:存放程序状态(标志位、模式等)

中断与异常

中断(Interrupt)

  • 来源于 外部硬件,如定时器溢出、串口接收
  • 触发后进入中断服务函数(ISR)
  • ISR 应该尽量简短,耗时任务放在“下半部”执行

异常(Exception)

  • 来源于 CPU 内部错误或特殊事件,如非法指令、除零错误
  • 触发后会进入异常向量表对应的处理函数

大端与小端存储

  • 大端(Big-endian):高字节存放在低地址
  • 小端(Little-endian):低字节存放在低地址(ARM 默认小端)

举例

int a = 0x12345678;
unsigned char *p = (unsigned char*)&a;
  • 小端存储:p[0]=0x78, p[1]=0x56, p[2]=0x34, p[3]=0x12
  • 大端存储:p[0]=0x12, p[1]=0x34, p[2]=0x56, p[3]=0x78

内存管理:堆与栈

  • 栈(Stack):由编译器自动管理,存储局部变量、函数参数
  • 堆(Heap):由程序员手动分配释放,存储动态数据

嵌入式开发中,栈一般较小,动态内存分配(malloc/free)需谨慎使用,以防止碎片化。


启动流程(Boot Process)

以 ARM Cortex-M MCU 为例:

  1. 上电复位

    • CPU 从固定地址读取复位向量
  2. 加载启动代码(Startup Code)

    • 初始化堆栈指针
    • 配置中断向量表
    • 初始化数据段和 BSS 段
  3. 调用 main()

    • 跳转到用户程序入口
  4. 运行应用程序


总结

本文从最基础的 CPU/MCU/SOC 概念 出发,讲解了嵌入式开发中常见的 交叉编译、ROM/RAM 运行方式、冯·诺依曼与哈佛架构,再深入到 ARM 架构下的工作模式、寄存器、中断与异常、大端小端存储、内存管理,最后介绍了 启动流程

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐