三、ARM

1.计算机CPU分类与ARM基础
1)CPU指令集架构分类
(1)CISC(Complex Instruction Set Computer,复杂指令集):代表为 x86。
特点:指令功能多、芯片复杂、成本高、体积大、功耗大。
(2)RISC(Reduced Instruction Set Computer,精简指令集):
特点:指令功能少、芯片简单、成本低、体积小、功耗低。
(3)ARM:设计RISC精简指令集架构CPU(分版本)。
商业模式:ARM公司设计内核,授权给半导体公司(如ST意法半导体),由半导体公司设计外围电路并生产芯片(如STM32F103)。
2)ARM内核版本分类
早期版本:ARM7、ARM9、ARM11。
Cortex系列(按应用领域划分):
Cortex-A (Application,应用领域):用于智能手机、高性能计算。
Cortex-A5 (摩托罗拉)
Cortex-A7 (IMX6ULL, STM32MP157)
Cortex-A8 (Samsung Gaxlay Note)
Cortex-A9 (Samsung Exynos 4412)
......
Cortex-A725 (玄戒o1)。
Cortex-R (Real-Time,实时性领域):用于汽车电子、工业控制。
Cortex-M (MCU,单片机领域):用于微控制器控制。
Cortex-M3 (STM32F103)
Cortex-M4 (STM32F407, STM32MP157)。
3)SOC架构
以NXP IMX6ULL Cortex-A7为例
外部引脚:VCC, GND, OSC (晶振), RESET (复位)。
内部结构:ARM kernel (内核)、GPIO、TIMER、USB、RAM控制器、RAM 128KB。
外部扩展:DDR3 512MB、EMMC 8GB。
2.总线、交叉编译与存储器基础
1)总线分类
单总线:内核和外设之间通过一组线连接通信。
多总线(双总线):按速度划分,实现高效通信。
速度快的外设 -> 内核:AHB总线: Advanced High Bus 先进高速总线(USB、网卡、RAM)
速度慢的外设 -> 内核:APB总线:Advanc Periphal Bus 先进外设总线(GPIO、UART、TIMER)
2)交叉编译
定义:在一个平台编写编译程序,在另外一个平台运行程序。
示例:在 Ubuntu 平台使用 arm-none-linux-gcc main.c 编译程序,生成的可执行文件放到 ARM 平台上运行。
3)存储器基础
RAM:易失性存储器(断电丢失),如 SRAM。
ROM:非易失性存储器(断电不丢失)。
Nor Flash:任何字节可以被寻址,带有地址总线和数据总线。
Nand Flash:块设备,以512byte为一块进行读写数据。
硬件参数记录:S3C2440 软件仿真 4KB RAM;EEPROM AT24C02 2048bit (256byte)。
3.ARM体系结构核心
以Cortex-A7 32位为例
1)寄存器组织
- ALU:算术逻辑单元,完成算术运算。
通用寄存器:R0 ~ R12(16个通用寄存器),用于存放数据。
特殊功能寄存器:
- SP (R13):Stack Pointer,栈指针寄存器,管理栈区空间。
- LR (R14):Linked Register,链接寄存器,保存函数的返回地址。
- PC (R15):Program Counter,程序计数器,本质是一个指针,指向当前程序正在执行指令的下一条指令。
状态寄存器:
- CPSR:Current Program Status Register,当前程序状态寄存器,记录程序运行到某一步时相关的状态(溢出、借位、进位)。
- SPSR:Save Program Status Register,保存/备份程序状态寄存器,保存当异常发生时 CPSR 寄存器中的值。
系统控制:
- MMU:Memory Mangement Unit 内存管理单元,将程序中的虚拟地址转换为物理地址

2)函数调用与栈机制
函数调用过程:
main 调用 add,add 调用 fn。
入栈:sp--,将数据存放到 sp 指向的新的位置。
出栈:从 sp 指向的位置取出数据,sp++。
栈的特点:先进后出(或后进先出)。
PC与LR配合:
执行 main 函数时,sp:0x1000000C 将 main 函数返回地址入栈。
pc:0x20000000 跳转到 add 函数执行。
sp:0x20000008 将 add 函数返回地址入栈。
pc:0x30000000 跳转到 fn 函数执行。
返回时,lr:0x20000008(sp) 将 add 函数返回地址存入到 lr,pc:lr 跳回到 add 函数。
最终 lr:0x1000000C(sp) 将 main 函数返回地址存入到 lr,pc:lr 跳回到 main 函数。
流水线结构:
三级流水线(取指 -> 译码 -> 执行)。
pc 取指令 -> 译码器翻译指令 -> CPU 执行指令。
3)MMU与CACHE
MMU (Memory Management Unit):内存管理单元,将程序中的虚拟地址转换为物理地址。
裸机:关掉 MMU。
Linux驱动:打开 MMU。
映射示例:进程1 (虚拟地址 0x20000000) -> MMU页表 -> 物理内存 RAM (0x80000000);进程2 (虚拟地址 0x20001000)。
CACHE:高速缓存,CPU直接从CACHE中访问数据,提高CPU访问数据效率。
D-CACHE:data cache 数据缓存(关闭dcache)。
I-CACHE:instruction cache 指令缓存(打开icache)。
4)计算机架构
冯·诺依曼架构:数据和指令共享同一块存储空间。
哈佛架构:数据和指令拥有独立的存储空间(现代计算机多采用此架构)。

4.数据存储与指令细节
1)存储模式(端序)
ARM处理器默认小端存储。
内存大端:高地址存放低数据位,低地址存放高数据位。
内存小端:高地址存放高数据位,低地址存放低数据位。
2)移位操作
逻辑右移 (LSR):最高位补0,不考虑数值的符号位(无符号数)。
示例:1011 0010 >> (LSR) 1 = 0101 1001
算术右移 (ASR):最高位补符号位,考虑数值的符号位(有符号数)。
示例:1011 0010 >> (ASR) 1 = 1101 1001
循环右移 (ROR):循环将每次移出的最低位补到最高位。
示例:1011 0010 >> (ROR) 1 = 0101 1001,再执行一次 >> (ROR) 1 = 1010 1100
5.异常与中断向量表
1)概念区别
中断向量表:本质是一个数组,数组中存放的是中断服务函数的入口地址。
异常向量表:本质是一个数组,数组中存放的是跳转到异常服务函数的指令。
注:向量表基地址可以位于 0xFFFF0000 (ARM720T, ARM9/10 family devices)。
2)异常向量表结构(按偏移量从低到高)
0x00:Reset(复位)
0x04:Undefined Instruction(未定义指令)
0x08:Software Interrupt(软中断)
0x0C:Prefetch Abort(预取指令异常)
0x10:Data Abort(数据异常)
0x14:保留
0x18:IRQ(中断请求异常)
0x1C:FIQ(快速中断请求异常)
6.版本对应关系总结
imx6ull -> Cortex-A7 (内核版本) -> ARMv7 (汇编指令集版本)
s3c2440 -> ARM920T (内核版本) -> ARMv4 (汇编指令集版本)
Exynos 4412 -> Cortex-A8 (内核版本) -> ARMv8 (汇编指令集版本)
