一、基础代码小案例
int i = 0xFFFFFFFF;
i+=1;
0xFFFFFFFF 加1后会发生溢出,这在ARM底层运算中会影响状态寄存器的标志位,也是理解CPSR寄存器的一个小例子。
pc初始示例地址:0x2000000
二、栈基础:先进后出,后进先出
栈操作规则:出栈时,从sp指向的位置取出数据,sp++。
SP寄存器专门用来管理栈空间,栈在嵌入式裸机、RTOS、Linux内核中都非常关键,函数局部变量、函数返回地址都依赖栈。
三、ARM内核通用寄存器(16个通用寄存器)
|---------------|---------------------|--------------------------|
| 寄存器别名 | 全称 | 作用说明 |
| R0R12 | 通用寄存器 | 用来存放普通运算数据 |
| R13 | SP(Stack Pointer) | 栈指针寄存器,管理栈区空间 |
| R14 | LR(Linked Register) | 链接寄存器,保存函数返回地址 |
| R15 | PC(Program Counter) | 程序计数器,指针,指向下一条要执行的指令 |
ALU:算术逻辑单元,负责完成CPU所有算术、逻辑运算。
四、CISC复杂指令集 vs RISC精简指令集
CISC 复杂指令集计算机
特点:指令功能多、芯片复杂、成本高、体积大、功耗大。
RISC Reduced Instruction Set Computer 精简指令集计算机
特点:指令功能少、芯片简单、成本低、体积小、功耗低。
ARM就是做RISC精简指令集CPU架构设计的公司,本身不生产芯片,把架构授权给各个半导体厂商,厂商再生产实际芯片。
五、ARM内核系列分类
ARM内核分为三大系列,对应不同应用场景:
1. CortexA:Application 应用领域
面向操作系统,跑Linux、安卓系统
-
CortexA5:早期智能机
-
CortexA7:IMX6ULL、STM32MP157(学习板常用)
-
CortexA8:三星早期手机
-
CortexA9:三星Exynos4412
-
CortexA725:玄戒O1
2. CortexR:RealTime 实时领域
汽车电子、工业高实时性场景。
3. CortexM:MCU单片机控制领域
单片机,裸机开发,不跑Linux
-
CortexM3:STM32F103
-
CortexM4:STM32F407、STM32MP157
STM32F103:意法半导体ST生产,CPU内核由ARM公司设计。
指令集版本:armv7、armv8。
架构:冯诺依曼架构:数据和指令共用同一块存储空间。
六、状态寄存器 & MMU内存管理单元
-
CPSR:程序状态寄存器,记录程序运行状态、运算标志位。
-
SPSR:保存程序状态寄存器,发生异常的时候备份CPSR的值,异常退出时恢复。
MMU Memory Management Unit 内存管理单元
-
功能:虚拟地址转换为物理地址,依靠页表完成映射
-
裸机开发:关闭MMU,直接操作物理内存
-
Linux驱动开发:打开MMU,使用虚拟内存
每个进程拥有4GB虚拟内存空间。
七、大小端存储模式
内存存储多字节数据,分为大端、小端模式:
-
大端模式:高地址存放低数据位;低地址存放高数据位。网络通信一般用大端。
-
小端模式:高地址存放高数据位;低地址存放低数据位。ARM芯片默认小端模式。
八、总线简单了解
-
单总线:内核和外设共用一组总线通信。
-
双总线/多总线:高速外设使用AHB总线(Advanced Highspeed Bus先进高速总线),速度更快。
九、交叉编译
交叉编译:在A平台编写编译程序,生成可执行文件,放到另一个不同架构的B平台运行。
比如电脑x86平台编译ARM开发板运行的程序,就是交叉编译。
十、Flash存储:Nor Flash vs Nand Flash
-
Nor Flash:可以按字节寻址,具备独立地址总线、数据总线。可以直接运行代码。
-
Nand Flash:块设备,以512字节为一块进行读写,不能直接运行程序。
Flash属于非易失存储器,断电数据不丢失;内存SDRAM是易失存储器,断电丢失数据。
十一、中断向量表 / 异常向量表
-
中断向量表:本质数组,存放中断服务函数入口地址。
-
异常向量表:本质数组,存放跳转到异常服务函数的汇编指令。
ARM7/ARM9开发板异常向量表地址常见:0x00000000 或者 0xFFFF0000。
向量表包含:Reset复位、Undefined instruction未定义指令、SWI软件中断、Prefetch Abort预取中止、Data Abort数据中止、IRQ普通中断、FIQ快速中断。
十二、ARM三种移位运算
- 逻辑右移 LSR:无符号数移位,最高位补0
示例:1011 0010 LSR 1 → 0101 1001
- 算术右移 ASR:有符号数移位,最高位补符号位
示例:1011 0010 ASR 1 → 1101 1001
- 循环右移 ROR:最低位移出,补到最高位
示例:1011 0010 ROR 1 → 0101 1001;再ROR1得到1010 1100