4-1 地址空间与 RISC、CISC · 学习笔记
所属课程:韦东山《ARM架构与编程》(百问网 · 单片机核心课程 ARM 架构篇)
所在章节:第 4 章 ARM 芯片基础(本章第 1 节)
讲师:韦东山
整理日期:2026-09-29
目录
- 摘要
- 一、本节在课程中的位置
- 二、核心命题
- 三、知识点展开
- [3.1 ARM 中的寄存器访问:像访问内存一样](#3.1 ARM 中的寄存器访问:像访问内存一样)
- [3.2 地址空间:CPU 眼中的世界](#3.2 地址空间:CPU 眼中的世界)
- [3.3 RISC:精简指令集计算机](#3.3 RISC:精简指令集计算机)
- [3.4 CISC:复杂指令集计算机](#3.4 CISC:复杂指令集计算机)
- [3.5 RISC 与 CISC 对比总表](#3.5 RISC 与 CISC 对比总表)
- 四、常见误区
- 五、本节结论与延伸
- [附录 A:术语速查](#附录 A:术语速查)
- [附录 B:自查清单](#附录 B:自查清单)
摘要
本节阐释 ARM 统一编址模型:内存与外设寄存器同处一个地址空间,CPU 的地址经内存控制器译码分派,故访问寄存器如同访问内存。进而对比两类指令集:RISC 仅以 Load/Store 访存、运算在 CPU 内完成、指令精简单周期;CISC 指令强而复杂,靠微程序实现。
一、本节在课程中的位置
本节是第 4 章的第一节,属于从"会用外设"到"理解芯片"的转折点:
- 承上:前面章节围绕 51/STM32 外设编程(GPIO、UART、定时器、RTC/LCD 等),侧重"照手册操作寄存器"。
- 本节起 :课程转入 ARM 架构层面,先回答两个最根本的问题------CPU 眼中的世界(地址空间)是什么样的?ARM 属于哪类指令集(RISC)?
- 启下:后续小节将依次展开 CPU 内部构造(Cortex-M3/M4 内核、通用寄存器 R0~R12、ALU)、程序运行过程、Thumb/Thumb-2 指令集与汇编编程。
一句话定位:本节建立"地址空间"与"指令集风格"两个心智模型,是理解后续一切寄存器操作与汇编代码的前提。
二、核心命题
- ARM 如何访问寄存器? ------ 与访问内存完全同一套方法(统一编址,内存映射 I/O)。
- ARM 与 x86 的地址空间组织有何不同? ------ ARM 内存与 I/O 统一编址;x86 内存空间与 I/O 空间分离,需不同指令访问。
- RISC 与 CISC 的本质差异是什么? ------ RISC"运算在 CPU 内、访存只有 Load/Store";CISC 用复杂指令(内部微程序)把多个微操作打包成一条指令。
三、知识点展开
3.1 ARM 中的寄存器访问:像访问内存一样
在 ARM 体系中,外设控制器的寄存器与内存处于同一个地址空间,因此访问寄存器不需要专门的指令,用 C 语言的指针即可:
c
/* 访问内存中的变量 */
int a;
unsigned int *p = &a; // p 等于 "a 的地址"
*p = val; // 写这个地址,就是写 a
val = *p; // 读这个地址,就是读 a
/* 访问外设寄存器:方法完全相同 */
unsigned int *p2 = (unsigned int *)0x40010800; // 某寄存器的地址
*p2 = val; // 写这个地址,就是写该寄存器
val = *p2; // 读这个地址,就是读该寄存器
思维链条:原理图(外设接在哪个控制器上)→ 芯片手册(控制器的寄存器地址与位含义)→ 程序(对地址做读/写)。这条链是嵌入式开发一切"点灯""配串口"操作的通用范式。
3.2 地址空间:CPU 眼中的世界
在 ARM CPU 看来,内存与 I/O 的操作是完全一样的:
- CPU 发出一个地址,由内存控制器根据地址范围译码,把访问分配给不同设备(Flash/RAM、UART 控制器、USB 控制器、GPIO 控制器等)。
- 各设备寄存器都在同一个 4GB(32 位)地址空间中编址,这称为统一编址 / 内存映射 I/O(Memory-Mapped I/O)。
但地址空间是分层的,存在"爷---父---子"式的隔代访问关系:
- CPU 发出的地址可以直达内存控制器上挂接的各设备(第一层地址空间);
- 若外设是 EMMC 控制器外接的 Flash,则 CPU 的地址到达不了 Flash 本身 ------必须通过 EMMC 控制器间接访问。CPU 看到的 0 地址与 EMMC/Flash 侧的 0 地址不是同一个东西;
- 即:地址只在同一层空间内有效,不能越级访问。
对比 x86:x86 的内存空间与 I/O 空间是两套独立空间 ,须用不同指令(如 mov 与 in/out)访问,同一数值地址在不同指令下指向不同对象。
3.3 RISC:精简指令集计算机
ARM 属于精简指令集计算机(RISC, Reduced Instruction Set Computing),特点有三:
- 对内存只有读、写指令(Load/Store),运算类指令不直接访问内存;
- 数据运算在 CPU 内部完成(先装入通用寄存器,再由 ALU 运算);
- 指令简单,CPU 复杂度小、便于设计,大部分指令单周期执行、指令长度固定。
以 a = a + b 为例,RISC 需要四步(对应四条指令):
① 读内存:把 a 装入寄存器 R0
② 读内存:把 b 装入寄存器 R1
③ CPU 内部运算:ALU 计算 R0 + R1,结果存回 R0
④ 写内存:把 R0 写回 a 所在的地址
3.4 CISC:复杂指令集计算机
x86 属于复杂指令集计算机(CISC, Complex Instruction Set Computing):
- 指令能力强、更灵活,但更复杂,指令为可变长格式;
- 复杂指令内部通过**微程序(microprogram)**实现------一条乘法指令实际上在 CPU 内部仍然执行"读 a → 读 b → 计算 a×b → 写回"这四步微操作;
- 对程序员而言"一条指令搞定一切",但硬件为此付出了复杂度代价。
3.5 RISC 与 CISC 对比总表
| 对比维度 | RISC(ARM) | CISC(x86) |
|---|---|---|
| 指令能力 | 指令精简,多数指令使用率高 | 指令能力强,但多数指令使用率低 |
| 指令长度 | 固定长度 | 可变长格式 |
| 执行周期 | 大部分为单周期指令 | 复杂指令多周期 |
| 访存方式 | 仅 Load/Store 指令访存,运算在 CPU 内部 | 指令可直接处理内存中的数据 |
| 寻址方式 | 寻址方式少 | 支持多种寻址方式 |
| 实现方式 | 硬布线逻辑为主,利于流水线 | 微程序控制技术 |
| 寄存器 | 大量通用寄存器(如 R0~R12),数据/地址通用 | 多为特定用途的专用寄存器 |
| 设计代价 | CPU 复杂度小,易于设计 | CPU 复杂度高 |
四、常见误区
- "访问外设寄存器需要特殊指令" ------ 错。ARM 统一编址,读写寄存器与读写内存用同一套 Load/Store 指令,C 层面就是指针解引用。
- "地址空间 = 物理内存大小" ------ 错。32 位 ARM 的 4GB 地址空间是编址范围,其中既包含 RAM,也包含大量外设寄存器区域,与实际内存芯片容量无关。
- "CPU 的地址可以到达任何硬件" ------ 错。地址空间分层(如 CPU → EMMC 控制器 → Flash),只能逐层访问、不能越级;控制器另一侧的 0 地址与 CPU 侧的 0 地址含义不同。
- "RISC = 功能弱" ------ 错。RISC 只是把复杂度从指令集转移到编译器和 CPU 内部寄存器/流水线设计上,"简单指令 + 更多寄存器"反而换来了更高的执行效率与更低的功耗。
五、本节结论与延伸
结论:ARM 架构的两个基石------其一,统一编址的地址空间使"访问外设 == 访问内存",这正是嵌入式 C 程序用指针操作硬件的理论依据;其二,RISC 风格要求"数据先入寄存器、运算在 ALU、结果再写回",这决定了后续汇编编程的基本形态。
延伸到下一节:既然运算都发生在 CPU 内部,下一节将拆开 Cortex-M3/M4 内核,讲解 CPU 内部构造------通用寄存器组 R0~R12、ALU、程序计数器与取指---译码---执行的数据通路,并由此引出 Thumb/Thumb-2 指令集。
附录 A:术语速查
| 术语 | 含义 |
|---|---|
| RISC | 精简指令集计算机(Reduced Instruction Set Computing),ARM 所属流派 |
| CISC | 复杂指令集计算机(Complex Instruction Set Computing),x86 所属流派 |
| 统一编址 / 内存映射 I/O | 外设寄存器与内存共用一个地址空间的编址方式(Memory-Mapped I/O) |
| Load/Store | RISC 中唯一能访问内存的两类指令:读取 / 写回 |
| ALU | 算术逻辑单元,CPU 内部执行加减乘除与逻辑运算的部件 |
| 通用寄存器 | CPU 内部可同时存放数据与地址的高速存储单元(ARM 的 R0~R12) |
| 微程序 | CISC 中实现复杂指令的内部微操作序列,对程序员透明 |
| 内存控制器 | 根据 CPU 发出的地址译码、选择对应设备的部件 |
附录 B:自查清单
- 能用 C 指针写出让某 GPIO 寄存器置位/清零的代码,并解释它与访问内存变量为何是同一回事;
- 能画出"CPU → 内存控制器 → 各外设"的地址分配示意图;
- 能说出 EMMC 控制器外接 Flash 为什么不能被 CPU 直接按地址访问;
- 能完整写出 RISC 执行
a = a + b的四步流程; - 能从指令能力、指令长度、寻址方式、实现方式四个维度对比 RISC 与 CISC;
- 能解释为什么 RISC 需要"更多通用寄存器"这一设计选择。