ARM 裸机开发(1)——ARM 体系结构

一、嵌入式

嵌入式是以应用为中心、以计算机技术为基础、软硬件可裁剪的专用计算机系统,根据用户需求对功能、体积、成本、环境、可靠性做取舍。

一个嵌入式系统从下到上分三层:

复制代码
应用层 APP
操作系统 SYS
硬件系统

二、处理器家族先分清

计算机硬件由运算器、控制器、存储器、输入设备、输出设备五部分组成,运算器和控制器合起来就是 CPU。

按用途分的几个常见名词:

CPU(Central Processing Unit):中央处理单元,通用处理器。

GPU(Graphics Processing Unit):图形处理单元,大量并行运算。

FPU(Floating Processing Unit):浮点运算单元,专门算浮点。

NPU(Neural Processing Unit):神经网络处理器。

在嵌入式领域,按集成度和用途又有一组:

MPU(Micro Processing Unit):微处理器,通用型,偏重处理能力,一般要外接内存和存储。

MCU(Micro Control Unit):微控制器,集成度高,偏重控制,常说的"单片机"就是它。

DSP(Digital Signal Processing):数字信号处理器,为高强度数学运算设计的专用芯片。

SoC(System On Chip):片上系统,把 CPU、GPU、外设控制器集成到一块硅片上。

一个容易理解的类比:SoC 就像一张城市蓝图,把市政府(MPU)、公安局(MCU)、研究所(DSP)、机场(调制解调器)都规划在同一块土地上。

i.MX6ULL 就是典型的 SoC:内部除了 Cortex-A7 内核,还有 GPIO、PWM、UART、定时器等一堆外设控制器。

三、RAM 与 ROM

可直接寻址(可以,CPU 直接读写)一般不可被处理器直接寻址

单位容量价格(高)低

掉电(易失(数据丢失))非易失(数据保留)

读写速度(快)慢

四、架构与指令集

常见的架构四大类:X86、ARM、MIPS、RISC-V。

指令集分两大流派:

CISC(Complex Instruction Set Computer):复杂指令集,一条指令干很多事。X86(含 x64)属于这一类。

RISC(Reduced Instruction Set Computer):精简指令集,指令少而规整,靠流水线提效率。ARM、MIPS、RISC-V 属于这一类。

ARM 的指令集版本演进到 v1--v9,不同版本对应的内核型号不同:

Cortex-A(Application):应用处理器,跑 Linux/Android,性能优先。i.MX6ULL 的 Cortex-A7 属于这一类。

Cortex-R(Real-time):实时处理器,硬实时场景。

Cortex-M(Microcontroller):微控制器,低功耗低成本,STM32 用的 M3/M4 就是这一类。

所以"ARM 内核 32 位"指的是寄存器位宽和指令字长是 32 位。

五、寄存器

ARM 有 16 个通用寄存器 R0--R15,其中三个有特殊用途:

R13 = SP(Stack Pointer):栈指针,指向栈顶。

R14 = LR(Link Register):链接寄存器,BL 调用时保存返回地址。

R15 = PC(Program Counter):程序计数器,指向下一条要执行的指令。

这两个状态寄存器要区分:

CPSR(Current Program Status Register):当前程序状态寄存器,含条件标志位(NZCV)、中断屏蔽位、工作模式位。

SPSR(Saved Program Status Register):备份程序状态寄存器,发生异常时保存 CPSR 的值。

六、Cache、MMU 与虚拟内存

Cache(高速缓存):CPU 和内存之间的缓冲,分 I-Cache(指令)和 D-Cache(数据)。它利用程序的局部性,把常用的数据放在离 CPU 更近的地方。裸机阶段通常先关着或按需打开,因为 Cache 和 DMA 一起用会有数据一致性问题。

MMU(Memory Management Unit):内存管理单元,负责把物理地址映射成虚拟地址。关掉 MMU 时 CPU 直接访问物理地址;打开后所有访问都要经过 MMU 的页表转换。

虚拟内存空间的典型布局(以 32 位为例,从高地址到低地址):

复制代码
0xFFFFFFFF  操作系统内核栈
            ...
            静态区 / 已初始化 / 未初始化
0x00000000  代码段

这套布局在 Linux 程序里天天见到,和后面写链接脚本时划分 .text/.data/.bss 是同一套东西。

七、栈帧与函数调用

函数调用时,每层函数在栈上占一块自己的空间,叫栈帧,里面放局部变量、传进去的参数、返回地址。

复制代码
main  → fun0  → fun1

调用 fun1(0x4000, b) 时,R13(SP) 指向当前栈顶,R14(LR) 保存返回地址 0x3004,R15(PC) 指向 0x3004 之后的指令。fun1 内部再用 STMFD 把现场压栈,就形成了新的一层栈帧。

这也解释了昨天为什么要写保护现场:嵌套调用时 LR 会被覆盖,返回地址必须存在栈里。

八、流水线与总线

三级流水线:取指(Fetch)→ 译码(Decode)→ 执行(Execute)。三条指令同时在流水线的三个段里跑,所以 PC 指向的地址和"正在执行"的指令并不是同一条------写跳转指令时要考虑流水线的影响。

总线:

AHB(Advanced High-performance Bus):先进的高性能总线,挂在高速外设上。

APB(Advanced Peripheral Bus):先进的外设总线,挂在低速外设上。

昨天的时钟树里 AHB 132MHz、IPG 66MHz,就是这个层级关系:内核和内存走高速总线,UART、I2C 这类走低速总线。

九、重点总结

  1. 嵌入式 = 以应用为中心的专用计算机,软硬件可裁剪,分应用层、操作系统层、硬件层。
  2. MPU 偏处理、MCU 偏控制、DSP 偏运算、SoC 是集成,四个词不要混用。
  3. ARM 属于 RISC 阵营,Cortex-A 跑应用、Cortex-R 跑实时、Cortex-M 做控制。
  4. R13/SP 管栈、R14/LR 存返回地址、R15/PC 指向下一条指令;CPSR 是当前状态,SPSR 是异常时的备份。
  5. MMU 负责虚拟地址到物理地址的映射,Cache 负责速度差,两者的配置都在 cp15 里。
相关推荐
Navigator_Z2 小时前
LeetCode //C - 1309. Decrypt String from Alphabet to Integer Mapping
c语言·算法·leetcode
爱聊灵光的维C2 小时前
C语言初阶:关于函数设计的详细讲解和注意事项
c语言·开发语言·青少年编程·蓝桥杯·学习方法
abc light3 小时前
ARM 裸机开发(2)——ARM 汇编与启动代码
汇编·arm开发
wuminyu3 小时前
JVM规范学习总结:class执行性能差异
java·linux·c语言·jvm·c++
C++ 老炮儿的技术栈4 小时前
Linux 动态库踩坑:明明重新编译了 .so,调用函数返回值却一直不变(libfjrobot.so 版本号异常排查实录)
linux·c语言·网络·c++·visual studio
小向是个Der12 小时前
嵌入式进阶——MCU上电后的动作
c语言·单片机·mcu·学习·链接脚本
bkspiderx15 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
LDR00620 小时前
LDR6100 智能遥控器精品软文:Type-C 充电口与低功耗量产维护
c语言·开发语言
FLJwu1 天前
运动相机采购实战|第四篇(终章):一张清单走完选型全流程,把风险拦在源头
c语言·开发语言·数码相机·运动相机·oem 量产