3-2-1 ARM架构简明教程:硬件架构与汇编指令

3-2-1 ARM架构简明教程:硬件架构与汇编指令

1. 为什么要学习 ARM 架构?

在学习 RTOS(实时操作系统)或者单片机编程的时候,我们经常会遇到任务栈(Stack)任务调度等概念,而这些都与 CPU 的架构密切相关。只有深入理解 ARM 处理器的架构,你才能真正掌握 RTOS 的核心。

今天,我们就从 ARM 硬件架构基础汇编指令 这两个方面,来快速入门 ARM 架构。


2. ARM 处理器的架构

2.1 计算机的组成

如果你曾经自己组装过电脑,你会发现电脑的基本组成是:

  • CPU(中央处理器)
  • 内存(RAM)
  • 硬盘(存储)
  • 主板(连接各种硬件)

这些组件是分开的,需要主板连接起来。

但是,在嵌入式系统(单片机)里,情况有所不同。单片机使用的是 SoC(System on Chip,系统级芯片),即把 CPU、内存、存储等都集成在一个芯片上,如下图所示:

------------------------
|        ARM SoC       |
| -------------------  |
| | CPU            |  |
| -------------------  |
| | 内存 (SRAM)   |  |
| -------------------  |
| | Flash (存储)  |  |
| -------------------  |
------------------------

这里:

  • CPU 负责运算
  • 内存(SRAM)用于存放临时数据
  • Flash 存储程序代码

2.2 CPU 与内存的交互

在 ARM 处理器中,所有的计算都是在 CPU 内部进行的,内存(RAM)只是存储数据,它本身不具备计算能力。来看一个例子:

假设 C 语言代码:

a = a * b;

在 ARM 处理器中,CPU 无法直接在内存里进行乘法运算,它必须经过 4 个步骤

  1. 从内存中读取变量 a
  2. 从内存中读取变量 b
  3. 在 CPU 内部执行 a * b
  4. 把计算结果存回内存

这就是 精简指令集(RISC) 的特点——CPU 只提供基本的读写指令,所有计算都在 CPU 内部的 寄存器 里完成。


2.3 CPU 内部结构

那么,CPU 内部 是怎么存储变量 ab 的呢?来看 ARM CPU 的内部架构:

-------------------------
|  计算单元 (ALU)      |
-------------------------
|  R0  R1  R2  R3  R4  |
|  R5  R6  R7  R8  R9  |
|  R10 R11 R12 R13 R14 |
-------------------------

ARM 处理器有一组 寄存器(Register),用来存储运算过程中的临时数据

重点:

  • 变量 a 可能存放在 R0
  • 变量 b 可能存放在 R1
  • 计算 a * b 的结果会存放在 R0

这就解释了为什么 ARM 处理器在执行 C 代码时,需要先把数据加载到寄存器


2.4 栈指针(SP)、链接寄存器(LR)、程序计数器(PC)

在 ARM 处理器中,某些寄存器有特殊作用

寄存器 名称 作用
R13 SP(Stack Pointer) 栈指针,用于管理任务栈
R14 LR(Link Register) 链接寄存器,用于存放函数返回地址
R15 PC(Program Counter) 程序计数器,存放下一条要执行的指令

函数调用过程

void funcA() {
    funcB();  // 调用 funcB
}
  • funcA() 调用 funcB() 时,funcA() 的返回地址会被存入 LR(R14)
  • funcB() 执行完后,会从 LR 取回地址,回到 funcA() 继续执行。

这个机制对于 RTOS 的任务切换 至关重要,因为任务切换本质上就是修改 PC(R15)寄存器的值


3. ARM 汇编指令入门

3.1 内存读写指令(Load & Store)

ARM 处理器不能直接在内存里计算数据,必须先把数据加载到寄存器。

读取数据(Load)
LDR R0, [R1]

解释:

  • R1 指向的内存地址 读取 4 个字节,存入 R0
存储数据(Store)
STR R0, [R1]

解释:

  • R0 里的数据 存入 R1 指向的内存地址

3.2 算术指令(ADD、SUB)

加法
ADD R0, R1, R2

解释:

  • 计算 R1 + R2,把结果存入 R0
减法
SUB R0, R1, R2

解释:

  • 计算 R1 - R2,把结果存入 R0

3.3 比较指令(CMP)

CMP R0, R1

解释:

  • 比较 R0R1,结果存入 状态寄存器(PSR)
  • 这个结果会影响后续 B(跳转)指令的执行

3.4 跳转指令(B、BL)

直接跳转
B label

解释:

  • 无条件跳转label 位置
函数调用
BL func

解释:

  • 跳转到 func,并保存返回地址
  • 这个返回地址会存入 LR(R14)

func 执行完后,我们可以用:

BX LR

返回到调用 func 的位置。


4. 总结

今天我们学到了什么?

✅ ARM 处理器的 CPU、寄存器、内存 关系
✅ 任务栈(SP)、函数返回地址(LR)、程序计数器(PC) 的作用
✅ 基本的 ARM 汇编指令(LDR、STR、ADD、SUB、CMP、B、BL)

下一步学习

如果你想更进一步,建议你尝试:

  1. 用 Keil 编写简单的 ARM 汇编程序
  2. 理解 RTOS 任务切换的底层实现
  3. 深入学习 ARM Cortex-M 架构

ARM 处理器是嵌入式开发的基石,理解它的本质,你才能真正掌握 FreeRTOS 和更高级的嵌入式开发技术!


希望这篇文章对你有帮助,我们下节课见!

你可能感兴趣的:(freertos,arm开发,架构,硬件架构)