嵌入式——ARM1(详细篇)

【嵌入式ARM入门】ARM体系结构学习总结

📖今日学习:嵌入式系统基础、处理器分类、SOC概念、存储器、指令集、ARM32内核寄存器、CPSR、内存映射、AHB/APB总线、栈帧、三级流水线、C程序编译四阶段。

🔍文章大纲

  1. 嵌入式系统基础概念
  2. 各类处理器单元(CPU/GPU/FPU/NPU/MPU/MCU/DSP/SOC)
  3. 存储器 RAM / ROM 详解
  4. 指令集:CISC 复杂指令集 & RISC精简指令集
  5. ARM内核分类 Cortex‑A / R / M系列
  6. ARM32内核内部组成、通用寄存器R0‑R15
  7. CPSR / SPSR 程序状态寄存器
  8. 内存映射、AHB、APB总线
  9. ARM栈帧,函数调用过程sp、lr、pc变化
  10. ARM三级流水线工作原理
  11. C语言编译四个阶段
  12. ✨学习重点
  13. ⚠️易错点踩坑记录
  14. 📝学习小结

1. 嵌入式系统基础概念

嵌入式系统定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

嵌入式系统三层软件架构

  1. 应用层:业务应用程序,实现产品业务逻辑
  2. 操作系统层:Linux / RT‑Thread / FreeRTOS等操作系统内核,管理软硬件资源
  3. 硬件层:CPU、内存、外设、电路板硬件平台

冯诺依曼计算机五大硬件组成:

  • 运算器:完成算术、逻辑运算
  • 控制器:指挥协调各个部件工作
  • 存储器:存储程序和数据
  • 输入设备:接收外部信息(按键、传感器)
  • 输出设备:向外输出信息(LCD、LED、蜂鸣器)

冯诺依曼特点:程序与数据统一存放在存储器中

2. 各类处理器单元介绍

缩写 全称 功能说明 典型应用
CPU 中央处理单元 通用处理器,负责控制、通用运算 电脑、ARM开发板
GPU 图形处理单元 专门处理图像、图形渲染 手机显卡
FPU 浮点运算单元 专门处理浮点数float/double运算 Cortex‑A带FPU,M部分内核不带
NPU 神经网络处理单元 AI人工智能运算,深度学习 智能手机AI算力
MPU 微处理器 通用处理器,需要外接RAM/ROM,无片上外设 Cortex‑A系列
MCU 微控制器(单片机) CPU+RAM+ROM+外设全部集成芯片内部,高度集成 51单片机、STM32 Cortex‑M
DSP 数字信号处理器 擅长大量数字信号运算,滤波FFT等 音频、通信信号处理
SOC System‑On‑Chip 片上系统 设计理念,把MPU/DSP/GPU、内存控制器、各类外设全部集成在一颗芯片内部 手机主芯片

重要区分:

  • MCU单片机:外设内置芯片,拿来就用;资源有限,一般跑裸机/RTOS。
  • MPU微处理器:内核,大部分外设、RAM、Flash需要芯片外部外接;可以跑完整Linux系统。
  • SOC不是某一个具体芯片型号,是一种芯片集成架构思想。

3. 存储器 RAM 和 ROM

RAM 随机存取存储器

  1. CPU可以直接对RAM进行寻址读写;
  2. 易失性存储器,断电数据全部丢失
  3. 读写速度快;硬件成本高,容量一般不会特别巨大;
  4. 分为SRAM静态RAM、DRAM动态RAM。开发板DDR属于DRAM。

ROM 只读存储器

  1. CPU不能直接寻址运行ROM内部代码,代码需要拷贝到RAM再执行;
  2. 非易失存储器,断电数据保存
  3. 单位字节成本低,容量可以做很大;读写速度比RAM慢很多。

常见ROM类设备:Nor‑Flash、Nand‑Flash,开发板上存放固件、系统镜像。
补充:ARM开发板启动过程:固件存放在Nand‑Flash(ROM类),上电把代码拷贝到DDR(RAM),再在RAM中运行程序。

4. 指令集架构 CISC / RISC

CISC 复杂指令集

  • 代表:X86(PC电脑CPU)
  • 特点:指令数目繁多,指令长度不固定;硬件电路复杂。

RISC 精简指令集

  • 代表:ARM、RISC‑V、MIPS
  • 特点:指令数量少;指令长度全部固定(ARM32位指令4字节);硬件设计简单,低功耗,非常适合嵌入式设备。

ARM内核三大系列:

  1. Cortex‑A系列:应用处理器,带MMU,支持运行完整Linux系统;手机、嵌入式开发板。
  2. Cortex‑R系列:实时处理器,高实时性,用于汽车电子工业控制,无MMU。
  3. Cortex‑M系列:微控制器内核,单片机内核,无MMU;裸机、RTOS,STM32。

MMU内存管理单元:只有带MMU的Cortex‑A才能使用虚拟内存,运行完整Linux;Cortex‑M/R没有MMU,只能操作物理地址。

5. ARM32位内核内部结构

ARM32:机器字长32位,CPU一次处理4字节数据。

内核主要组成部分:

  1. 通用寄存器R0~R15 (16个32位通用寄存器)
    |寄存器 |别名 |作用 |
    |---|---|---|
    |R0‑R12 |通用寄存器 |用于临时保存运算数据;R0‑R3函数传参 |
    |R13 |SP |栈指针,永远指向栈顶 |
    |R14 |LR(Link Register) |链接寄存器,保存函数返回地址 |
    |R15 |PC(Program Counter) |程序计数器,保存取指的内存地址 |

ARM流水线影响:PC的值 = 当前执行指令地址 + 8字节。面试高频考点!

  1. ALU算术逻辑单元:完成加减、逻辑与或非运算。
  2. I‑Cache 指令高速缓存;D‑Cache数据高速缓存。

Cache解决CPU速度远大于内存访问速度的矛盾,缓存热点指令和数据,提升运行速度。

  1. MMU内存管理单元:虚拟地址 ↔ 物理地址转换,内存权限管理。
  2. CPSR 当前程序状态寄存器;SPSR备份程序状态寄存器。

CPSR / SPSR 程序状态寄存器

CPSR:32位寄存器,记录程序运行状态。

  • 条件标志位N Z C V,ALU运算结果会自动修改标志位,用于if判断、跳转。
  • 控制位:中断总开关I、F;处理器工作模式位。

SPSR:备份状态寄存器。发生异常中断时,保存CPSR现场;异常返回,把SPSR恢复回CPSR。普通程序模式不能访问SPSR。

ARM7有7种处理器工作模式:用户模式、FIQ、IRQ、管理模式、中止、未定义、系统模式。发生异常自动切换模式。

6. 内存映射与总线 AHB / APB

ARM外设(GPIO、UART、定时器)寄存器全部映射到内存地址空间。访问这个地址等价于操作外设寄存器。

总线分类

总线分为三类:

  1. 地址总线:传递要访问的内存/寄存器地址
  2. 数据总线:传输读、写的数据
  3. 控制总线:传输读写、使能等控制信号

开发板两套常用片上总线:

  1. AHB 高性能先进总线:高速总线,内核、DDR内存控制器,高速外设挂载AHB。
  2. APB外设总线:低速外设总线,GPIO、UART、I2C、SPI挂载APB。

AHB总线通过桥接模块转换到APB总线。

内存地址空间分区:

  1. DDR(RAM)区域:存放程序代码、全局变量、堆、栈。
  2. 外设寄存器地址段:各个片上外设寄存器映射地址。
  3. Flash控制器地址区间。

7. ARM栈帧,函数调用机制

ARM栈:满递减栈,栈从高地址向低地址方向增长,SP(R13)指向栈顶有效数据

栈帧:每调用一个函数,就在栈上面开辟一块独立内存区域,叫做栈帧。栈帧保存:局部变量、寄存器现场、函数返回地址LR。

函数调用完整流程示例 main调用funcA,funcA调用funcB:

  1. main调用funcA,把返回地址存入LR寄存器。
  2. SP向低地址移动,开辟funcA栈帧,保存局部变量。
  3. funcA调用funcB,再次更新LR,SP继续减小开辟funcB栈帧。
  4. funcB执行完毕,从LR拿到返回地址,回到funcA;释放funcB栈帧,SP恢复。
  5. funcA执行完成,返回main,释放funcA栈帧。

重点:

  • SP(R13)永远指向栈顶,栈向下(低地址)扩张。
  • LR(R14)保存下一条返回指令地址,不是当前函数地址。
  • PC(R15)指向即将取指的指令。

8. ARM三级流水线(ARM7)

流水线目的:提升CPU指令吞吐率,多条指令重叠并行处理

三级流水线三个阶段:

  1. 取指(Fetch):从内存读取指令
  2. 译码(Decode):解析指令,确定要做什么运算
  3. 执行(Execute):ALU执行运算

同一时刻,三条指令分别处于不同流水线阶段。

例:第1条指令执行,第2条译码,第3条取指,并行工作。

⚠️注意:流水线不是多条指令同时全部执行完毕,只是阶段重叠。

因为流水线,ARM32中PC = 当前正在执行指令地址 + 8字节,面试经常考察。

9. C语言编译四个阶段

gcc编译C程序分为4个步骤:预处理 → 编译 → 汇编 → 链接

bash 复制代码
#1.预处理:处理# include #define #ifdef,展开头文件、宏替换,生成.i文件
gcc -E test.c -o test.i

#2.编译:C语言翻译成汇编语言.s
gcc -S test.i -o test.s

#3.汇编:汇编转成机器码目标文件.o
gcc -c test.s -o test.o

#4.链接:把多个.o目标文件、系统库合并,生成可执行程序
gcc test.o -o test
  • 预处理:只处理#开头内容,不做语法检查
  • 编译阶段:做C语言语法检查,报错大多在此阶段。
  • 汇编:把汇编翻译成二进制机器码。
  • 链接:合并段,解析符号,分配内存地址。

✨学习重点

  1. 嵌入式系统三层架构,冯诺依曼五大硬件部件;理解嵌入式软硬件可裁剪的特点。
  2. 分清MCU、MPU、DSP、SOC概念:SOC是芯片集成设计理念,MCU单片机内置全部外设,MPU需要外接内存Flash。
  3. RAM断电丢失、ROM断电保存;ARM开发板上电把Flash(ROM)镜像拷贝到DDR(RAM)运行。
  4. RISC精简指令集ARM,指令定长;CISC复杂指令集X86。Cortex‑A带MMU跑Linux;M/R无MMU。
  5. ARM32寄存器:R13(SP栈顶)、R14(LR返回地址)、R15(PC程序计数器);流水线导致PC值=当前执行指令+8字节
  6. CPSR保存运算标志位与处理器模式;SPSR异常模式用来备份CPSR。
  7. AHB高速总线,APB低速外设总线;外设寄存器全部内存映射,访问地址等于操作硬件。
  8. ARM栈:满递减栈,由高地址向低地址增长;栈帧概念,函数调用时SP、LR、PC配合工作。
  9. ARM7三级流水线:取指‑译码‑执行,提升指令吞吐。
  10. gcc编译四阶段,每个阶段对应的gcc参数‑E ‑S ‑c,每个阶段做什么事情。

⚠️易错点 & 踩坑记录

  1. ❌认为SOC是某一款芯片。✅SOC是片上系统的设计思想,不是单个芯片型号。
  2. ❌混淆MCU与MPU:MCU(STM32/51)片内自带RAM Flash外设;MPU(Cortex‑A)必须外部接DDR、Flash。
  3. ❌ROM可以直接运行程序:ARM不能直接在NandFlash运行程序,必须拷贝进RAM再运行。
  4. ❌ARM栈方向记反:ARM满递减栈,栈向低地址增长,SP指向栈顶,不是栈底。
  5. ❌PC寄存器等于当前正在执行指令地址。✅流水线:PC = 当前执行指令地址 + 8
  6. ❌SPSR可以在用户模式随便读写:SPSR只有异常模式才可以访问,普通用户模式无法读取。
  7. ❌AHB接串口、I2C低速外设:低速外设挂载APB总线;AHB给内核、DDR控制器。
  8. ❌流水线理解错误:流水线不是多条指令同时全部执行完成,只是各个阶段重叠。
  9. ❌gcc参数混淆:‑E预处理,‑S生成汇编,‑c只汇编不链接;很多同学把‑c当成生成可执行程序。
  10. ❌Cortex‑M内核想跑Linux:M内核没有MMU,无法运行标准Linux,只能裸机/RTOS。

📝学习小结

今天学习ARM嵌入式底层体系,从嵌入式系统基础、各类处理器、存储器,再到RISC指令集,ARM32内核寄存器、CPSR状态寄存器;理解内存映射、AHB/APB总线;掌握ARM栈帧、函数调用寄存器变化;ARM7三级流水线;C语言gcc编译完整四个阶段。

相关推荐
周洲08301 小时前
STM32 ADC 采集实战|电压采集、分压计算、数据滤波
stm32·单片机·嵌入式硬件
狂奔蜗牛(bradley)2 小时前
搞定100ns抖动:ARM+FPGA混合EtherCAT主站实战方案
嵌入式硬件·fpga开发
HZZD_HZZD3 小时前
CSDN_批发市场水电漏损归因算法LAM的原理与落地
嵌入式硬件·物联网·算法
H_oRIZoN_4 小时前
Linux入门DAY40(51 单片机入门:GPIO、中断、定时器、PWM、蜂鸣器完整梳理)
单片机·嵌入式硬件
DYWorker0014 小时前
Linux驱动子系统:DMA-Buf —— Consumer和Provider(008)
linux·驱动开发
LCG元4 小时前
STM32F103 复位来源诊断实战:RCC_CSR 标志位判优、BKP 复位计数持久化与六种复位源注入实测
stm32·单片机·嵌入式硬件
雯宝5 小时前
Linux 内核函数集
linux
GeW5 小时前
从挂科到高分通过:RHCE快速拿证的10个提分技巧
linux
神威难绷泪6 小时前
arm day2 汇编
arm