一、ARM架构概述
ARM(Advanced RISC Machine)是一种精简指令集(RISC) 架构。和51单片机相比,主要有几个区别:
| 对比项 | 51单片机 | ARM |
|---|---|---|
| 位数 | 8位 | 32位 |
| 指令集 | CISC风格 | RISC精简指令集 |
| 寄存器数量 | 少 | 多(通用寄存器+状态寄存器) |
| 工作模式 | 单一 | 多种模式 |
| 异常处理 | 简单 | 规范的异常向量表 |
ARM主要用于手机、平板、嵌入式设备,是当前最主流的嵌入式架构之一。
二、Cortex-A寄存器
ARM的寄存器分为通用寄存器 和状态寄存器两大类。
2.1 通用寄存器
Cortex-A内核有 R0 ~ R15 共16个通用寄存器,其中几个有特殊用途:
| 寄存器 | 别名 | 作用 |
|---|---|---|
| R0 ~ R12 | --- | 通用数据寄存器,随便用 |
| R13 | SP | Stack Pointer,栈指针,指向当前栈顶 |
| R14 | LR | Link Register,链接寄存器,保存函数返回地址 |
| R15 | PC | Program Counter,程序计数器,存下一条指令地址 |
R0 ~ R12 是普通工作寄存器,存数据、传参数都可以。
R13(SP) 管栈,压栈弹栈都靠它。
R14(LR) 管返回地址,函数执行完靠它跳回去。
R15(PC) 管下一条指令,程序"往下走"靠它。
2.2 状态寄存器
ARM有两个状态寄存器,容易混淆:
| 寄存器 | 全称 | 作用 |
|---|---|---|
| CPSR | Current Program Status Register | 当前程序状态 |
| SPSR | Saved Program Status Register | 保存的程序状态 |
CPSR 保存当前程序的状态,包括:
-
条件标志位:N(负)、Z(零)、C(进位)、V(溢出)
-
中断屏蔽位:I(IRQ禁止)、F(FIQ禁止)
-
运行模式位:当前处于哪种模式
-
指令集状态:ARM状态 / Thumb状态
SPSR 只在异常模式下才存在。当异常发生时,CPU 自动把异常前的 CPSR 存进 SPSR;异常处理完,再从 SPSR 恢复回 CPSR。
三、ARM工作模式
ARM有多种工作模式,不同模式权限不同、能访问的寄存器也不同。
| 模式 | 名称 | 用途 |
|---|---|---|
| User | 用户模式 | 普通程序运行模式,权限最低 |
| FIQ | 快速中断模式 | 处理高速中断,优先级最高 |
| IRQ | 普通中断模式 | 处理普通中断 |
| Supervisor | 管理模式 | 系统复位、软中断后进入 |
| Abort | 中止模式 | 存取异常时进入 |
| Undefined | 未定义模式 | 执行未定义指令时进入 |
| System | 系统模式 | 特权模式,和User共用寄存器 |
前6种叫异常模式 ,普通程序运行在 User模式,出了事情(中断、异常)就切到对应的异常模式。
四、异常模式与异常向量表
4.1 什么是异常
异常是打断正常程序执行的事件,包括:中断(IRQ/FIQ)、软中断(SWI)、复位、取指/取数出错、未定义指令等。
发生异常时:
-
把当前 CPSR 保存到 SPSR
-
切换到对应的异常模式
-
跳到异常向量表中对应的入口地址
-
处理完异常,恢复 CPSR,返回原程序
4.2 异常向量表
异常向量表是一张固定的地址表,每个异常对应一个入口:
| 地址 | 异常 |
|---|---|
| 0x00 | 复位 |
| 0x04 | 未定义指令 |
| 0x08 | 软中断(SWI) |
| 0x0C | 取指中止 |
| 0x10 | 取数中止 |
| 0x14 | 保留 |
| 0x18 | IRQ中断 |
| 0x1C | FIQ中断 |
CPU遇到异常时,自动跳到对应地址去执行处理代码。
五、指令集与数据类型
5.1 数据类型
ARM支持以下基本数据类型:
| 类型 | 位数 | 说明 |
|---|---|---|
| 字节 | 8位 | Byte |
| 半字 | 16位 | Halfword |
| 字 | 32位 | Word |
5.2 指令集
ARM有几种指令集状态:
| 指令集 | 说明 |
|---|---|
| ARM指令集 | 32位指令,功能全,效率高 |
| Thumb指令集 | 16位指令,代码密度高,省空间 |
| Thumb-2 | 16/32位混合,兼顾性能和空间 |
ARM和Thumb可以切换,通过 CPSR 中的 T 位控制。
六、封装模式(大小端)
ARM支持大端 和小端两种存储模式:
| 模式 | 低地址存什么 | 举例 0x12345678 |
|---|---|---|
| 小端 | 低位字节 | 78 56 34 12 |
| 大端 | 高位字节 | 12 34 56 78 |
ARM默认是小端模式,可以通过配置切换。
七、今日总结
今天学了ARM基础,核心要点如下:
-
Cortex-A寄存器:R0~R12通用,R13=SP(栈指针),R14=LR(返回地址),R15=PC(下一条指令)
-
状态寄存器:CPSR是当前状态,SPSR是异常现场存档
-
工作模式:User(用户)+ 6种异常模式(FIQ、IRQ、Supervisor、Abort、Undefined、System)
-
异常向量表:每种异常对应固定入口地址,异常发生自动跳转
-
数据类型:字节(8位)、半字(16位)、字(32位)
-
指令集:ARM(32位)、Thumb(16位)、Thumb-2(混合)
-
大小端:ARM默认小端,可配置为大端