一、RISC 与 CISC 指令集
CISC 复杂指令集计算机
指令功能丰富,硬件芯片设计复杂,成本高、体积大、功耗高,代表:x86 PC 处理器。
RISC 精简指令集计算机(ARM 属于 RISC 架构)
RISC:Reduced Instruction Set Computer
- 指令功能少,硬件电路简单
- 成本低、体积小、功耗低
ARM 公司只设计 CPU 架构,不生产芯片,把架构授权给半导体厂商(ST、NXP、三星等)生产实际芯片。
二、ARM 内核分类(Cortex 系列)
ARMv7、ARMv8 为汇编指令集版本;Cortex 是内核系列:
- Cortex‑A:Application 应用处理器 面向复杂操作系统,跑 Linux、安卓
- A5、A7(IMX6ULL、STM32MP157)、A8、A9、A725(玄戒 O1)
- Cortex‑R:Real‑Time 实时内核 汽车电子、工业实时控制,强实时性
- Cortex‑M:MCU 单片机内核 单片机领域,裸机开发
- M3:STM32F103;M4:STM32F407、STM32MP157
STM32F103:ST 意法半导体生产,内核是 ARM Cortex‑M3
冯・诺依曼架构
指令和数据共用同一块存储器空间,Cortex‑A7 属于 32 位冯诺依曼架构。
三、ARM 内核寄存器
Cortex‑A7 内核寄存器基础
表格
| 寄存器 | 别名 | 作用说明 |
|---|---|---|
| R0‑R11 | 通用寄存器 | 用来临时存放运算数据 |
| R12 | IP | 内部暂存寄存器 |
| R13 | SP Stack Pointer | 栈指针;栈规则:先进后出,后进先出;出栈:从 sp 指向位置取数据,sp++ |
| R14 | LR Link Register | 链接寄存器,保存函数返回地址 |
| R15 | PC Program Counter | 程序计数器,存指令地址;指向下一条要执行的指令 |
💡注意:Cortex‑A7 总共有40 个寄存器 ;物理通用寄存器一共 16 个(R0~R15);不同工作模式下会切换备份寄存器。
状态寄存器
- CPSR:当前程序状态寄存器,保存当前 CPU 运行状态、条件标志位、处理器工作模式。
- SPSR:备份程序状态寄存器;发生异常时,备份保存 CPSR 现场,异常处理完毕后用来恢复 CPSR。
ALU 算术逻辑单元
负责完成 CPU 的加减、逻辑与或非移位等运算。
四、MMU & CACHE
MMU 内存管理单元
MMU:Memory Management Unit
- 功能:把程序的虚拟地址转换为物理地址,依靠页表完成地址映射。
- 裸机开发:关闭 MMU,直接操作物理地址
- Linux 驱动开发:打开 MMU,使用虚拟地址,每个进程拥有独立 4GB 虚拟地址空间。
CACHE 高速缓存
CACHE 是 CPU 和内存之间的高速小容量存储器。
- 速度:CPU > Cache > 内存 DDR
- 作用:缓解 CPU 和 DDR 内存之间速度差距,把频繁访问的数据 / 指令缓存到高速 Cache,减少访问低速内存次数,提升 CPU 运行效率。
五、冯・诺依曼架构 和 哈佛架构
- 冯・诺依曼架构 指令、数据存放在同一个存储器,共用一套地址 / 数据总线。取指令和读写数据不能完全并行。代表:Cortex‑A7。
- 哈佛架构 指令存储器、数据存储器相互独立,分开两套总线。取指令和读写数据可以同时进行,效率高。代表:Cortex‑M 系列单片机。
六、大小端存储模式
针对多字节数据在内存的存放规则:
- 大端模式:低地址存高字节,高地址存低字节(网络协议常用)
- 小端模式:低地址存低字节,高地址存高字节(ARM CPU 默认小端)
示例:int i = 0xFFFFFFFF; i +=1;,发生无符号溢出,结果为 0。
七、ARM 三种移位指令
- LSR 逻辑右移 :无符号数移位,右移,高位补 0
1011 0010 LSR #1 → 0101 1001 - ASR 算术右移 :有符号数移位,高位补符号位
1011 0010 ASR #1 → 1101 1001 - ROR 循环右移 :最低位移出,补到最高位
1011 0010 ROR #1 → 0101 1001
八、总线、存储器件、交叉编译
总线
- 单总线:内核外设共用一组信号线,速度慢
- 多总线:AHB 先进高速总线,给高速外设使用
Flash 存储
- Nor Flash :拥有地址、数据总线,可以按单个字节寻址,可以直接运行程序。
- Nand Flash:块设备,以 512 字节为块读写,不能直接执行代码。
RAM:易失存储器,断电数据丢失;Flash 非易失,断电保存数据。
交叉编译
在 PC(x86 平台)编写编译程序,编译出可以在 ARM 平台运行的二进制程序。PC 叫宿主机,ARM 叫目标板。
九、中断向量表 & 异常向量表 & 异常处理流程
- 中断向量表 :数组,数组里面存放中断服务函数入口地址。
- 异常向量表:数组,存放跳转到异常服务函数的汇编指令。
向量表基地址可以设置为
0x00000000或者0xFFFF0000,不同芯片有差异。 异常类型:Reset 复位、未定义指令、软中断、预取中止、数据中止、IRQ 普通中断、FIQ 快速中断。
ARM 异常处理完整流程
- 发生异常,CPU 硬件自动保存现场:把 CPSR 复制到对应模式 SPSR,将返回地址存入该模式下 LR;
- CPU 硬件自动切换处理器工作模式,跳转到异常向量表对应的入口地址;
- 执行异常向量表内跳转指令,进入异常服务函数;
- 在异常服务函数内部做业务处理;
- 异常返回:从 SPSR 恢复 CPSR,从 LR 修正后恢复 PC,回到被打断的程序继续执行。
十、ARM 处理器工作模式
Cortex‑A7(ARMv7)一共有7 种处理器工作模式
- 用户模式 (User):普通应用程序运行模式
- 系统模式 (System):特权模式,和 User 共用寄存器
- 快中断模式 (FIQ):处理快速中断
- 中断模式 (IRQ):普通外设中断
- 管理模式 (SVC):复位、系统调用进入,操作系统内核常用模式
- 中止模式 (Abort):内存访问出错(数据 / 预取异常)进入
- 未定义模式 (Undef):遇到未识别指令进入
除 User 用户模式是非特权模式,其余 6 种均为特权模式,可以访问全部硬件资源。
📚重点问题
- ARM 处理器工作模式有几种?
- 答:Cortex‑A7 (ARMv7) 共 7 种工作模式:User、System、FIQ、IRQ、SVC、Abort、Undef;1 种非特权 (User),6 种特权模式。
- Cortex‑A7 内核有多少个寄存器?
- 答:物理寄存器总数 40 个;不同模式会切换分组寄存器。
- Cortex‑A7 内核有多少个通用寄存器?PC、LR、SP 通用寄存器作用?
- 答:基础通用寄存器 16 个 R0~R15;PC (R15):程序计数器,保存下一条将要执行指令的地址;LR (R14) 链接寄存器:保存函数调用返回地址,异常模式下保存异常返回地址;SP (R13) 栈指针:指向当前栈顶,管理栈空间,栈遵循先进后出。
- CPSR 寄存器和 SPSR 寄存器作用?
- 答:CPSR:当前程序状态寄存器,保存当前 CPU 的条件标志位、中断使能位、处理器工作模式;所有模式共用。SPSR:备份程序状态寄存器,每种异常特权模式拥有一份;发生异常时备份 CPSR,异常返回时恢复 CPSR。User 用户模式没有 SPSR。
- 什么是 MMU?
- 答:内存管理单元,完成虚拟地址→物理地址转换,借助页表;裸机关闭 MMU 直接访问物理地址;Linux 操作系统打开 MMU,实现进程独立虚拟地址空间、内存保护。
- 什么是 CACHE?
- 答:高速缓存,位于 CPU 和 DDR 内存之间高速存储部件,解决 CPU 运算速度远大于内存读写速度的矛盾;缓存常用指令和数据,减少访问低速内存次数,提升整体性能。
- 冯・诺依曼架构和哈佛架构的区别?
- 答:冯诺依曼:指令与数据共用同一套存储器与总线;取指令和读写数据不能并行;Cortex‑A7 使用该架构。哈佛架构:指令存储器、数据存储器相互独立,两套独立总线;取指令和读写数据可以同时执行;Cortex‑M 单片机使用。
- 异常处理流程?
- 答:①硬件自动保存现场:CPSR→SPSR,异常返回地址存入对应模式 LR; ②硬件自动切换 CPU 特权工作模式; ③跳转到异常向量表对应条目; ④跳转执行异常服务函数,处理业务; ⑤异常返回:SPSR 恢复 CPSR,LR 修正后赋值给 PC,回到原程序继续运行。
- IMX6ULL 芯片所搭载的内核版本?
- 答:NXP IMX6ULL 搭载 Cortex‑A7 内核。
- Cortex‑A7 使用的汇编指令集版本?
- 答:ARMv7‑A 指令集版本。
- nor flash 和 nand flash 区别?
- 答:Nor Flash:具备地址、数据总线,可以字节寻址,支持片上执行 (XIP);容量一般偏小,成本高。Nand Flash:块设备,以块(512 字节)单位读写,不能直接运行代码;容量大、成本低;需要驱动完成读写。
📝学习小结
- ARM 是 RISC 精简指令集架构,只做架构授权,不造芯片。
- PC、LR、SP、CPSR/SPSR 是 ARM 汇编最核心,要分清各自用途;7 种处理器模式为面试高频。
- MMU 区分裸机(关)和 Linux(开)开发场景;Cache 解决 CPU 与内存速度不匹配。
- 移位指令要分清逻辑右移、算术右移、循环右移,考试、面试高频考点。
- 异常向量表是裸机中断启动的基础,Reset 复位向量是上电第一条执行代码入口。
- Cortex‑A7 内核:40 个物理寄存器,指令集 ARMv7‑A;IMX6ULL 使用 Cortex‑A7。
后续计划:ARM 汇编基础、裸机点灯实验,C 语言和汇编混合编程。