嵌入式系统与ARM架构详细教程(小白入门到进阶)
嵌入式系统与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 -
流程:
- 在 Windows/Linux 上编译代码
- 生成
.elf或.bin文件 - 通过烧录工具下载到 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 为例:
-
上电复位
- CPU 从固定地址读取复位向量
-
加载启动代码(Startup Code)
- 初始化堆栈指针
- 配置中断向量表
- 初始化数据段和 BSS 段
-
调用
main()- 跳转到用户程序入口
-
运行应用程序
总结
本文从最基础的 CPU/MCU/SOC 概念 出发,讲解了嵌入式开发中常见的 交叉编译、ROM/RAM 运行方式、冯·诺依曼与哈佛架构,再深入到 ARM 架构下的工作模式、寄存器、中断与异常、大端小端存储、内存管理,最后介绍了 启动流程。
更多推荐
所有评论(0)