ARM课程大纲
ARM相关的基本概念
机器码
计算机能够识别由1和0组成的编码格式
汇编:将汇编文件转换为二进制文件(.bin/.elf)
汇编指令
是一条具备特殊功能的指令
编译:生成汇编文件
int a = 10; ------> mov r0 #10
编译
汇编指令集
由多条不同功能的汇编指令组成的集和
架构
由不同的汇编指令集设计出来的架构
x86汇编指令集设计出x86-64架构
arm汇编指令集设计出arm架构
arm v1-v6架构 目前已经淘汰
arm v7架构:只支持32位ARM指令集的架构 ----> stm32mp157a
arm v8架构:支持64位ARM指令集的架构,并且向下兼容arm v7架构
arm v9架构:最新的架构,未来十年的发展趋势
四大主流芯片架构:
x86架构、 ARM架构、 RISC-V架构、 Mips架构
inter 苹果、华为 nivida、三星 龙芯中科(龙架构)
不开源 不开源 开源 、
主流的芯片厂商:
ST、NXP、海思(麒麟)、高通、MTK(联发科)、TI(德州仪器)、SAMSUNG(Exynos猎户座)
新唐科技、展瑞、瑞芯微、中芯国际、阿里(平头哥)、小米(澎湃)、全志
兆易创新(GD32)、龙芯中科(电脑cpu)
内核
基于不同的架构设计出来不同的内核
ARM架构 ---> Cortex-A核 Cortex-M核
CPU:中央处理器,可以叫MPU MCU SOC
MCU:微控制器,一般指的是裸机,无法运行像Linux这种大型的操作系统的,但是它可以运行os实时操作系统(FreeRTOS、lite-os、RT Thread)
MPU:微处理器,一战指的是可以跑大型的操作系统的处理器
SOC:片上系统
ARM公司基于ARM指令集设计出ARM架构,ARM公司再基于ARM架构设计出了Cortex-A7内核
ARM将Cortex-A7内核授权给了ST(意法半导体)公司,ST公司基于Cortex-A7内核研发出了STM32MP157AAA芯片
ST公司将这个芯片卖给了华清远见,华清远见研发部基于STM32MP157A芯片添加很多的外设
最后构成了开发板
精简指令集和复杂指令集的区别
精简指令集 - RISC
汇编指令集相对于来说比较简单,易阅读
特点:指令的宽度和指令的周期固定
指令宽度:一条指令所占的空间,arm-v7架构的指令占32位(4个字节)的空间
指令周期:一条指令执行需要的时间
精简指令集:ARM架构、RISC-V、Mips架构、PowerPC架构
复杂指令集
特点:指令的周期和指令的宽度不固定
复杂指令集:x86架构
验证
复杂指令集
精简指令集
ARM处理器具备默认的汇编指令集 -> Thumb指令
Thumb指令集是ARM指令集的子集(儿子)
Thumb指令集每条指令占16位,及2字节的空间
ARM指令集每条指令占32位,及4字节的空间
ARM处理器的工作模式
Cortex-M核的工作模式
两种模式:线程模式、异常模式
Cortex-A核的工作模式
ARM v7架构的寄存器组织
存储类型
在c语言中我们学习过的6种存储类型?
auto static const extern volatile register
register:访问速度快,不允许取地址
volatile:防止编译器对代码进行优化,直接从内存中取最新的值
核内寄存器:不存在地址,只允许用编号访问,R0-R15 CPSR SPSR
定义变量的过程:存储类型+数据类型+变量名
寄存器位置
寄存器是一块具备特殊功能的存储空间
arm v7架构的寄存器组织
1、每个小方格都是一个寄存器,对于ARM V7架构而言,每个寄存器的大小是32位,4个字节
2、在user、sys模式下存在17个可控制的寄存器
3、在fiq、irq、abt、udf、svc、mon模式下存在18个可控制的寄存器
4、在hyp模式下存在19个可控制的寄存器
5、核内寄存器不存在地址,只能通过编号进行访问,编号由R0-R15, CPSR, SPSR
白色底的寄存器代表的是共有的寄存器,蓝色底的寄存器代表的是私有的寄存器
在异常模式下,如果存在私有的寄存器,只能访问私有的寄存器,不允许访问共有的寄存器
如果在工作模式下,没有私有的寄存器,就访问共有的寄存器
一共有43个可控制的寄存器
特殊功能寄存器( 重点 )
R13寄存器
R13寄存器 ----> sp寄存器 ----> the stack pointer ----> 栈指针寄存器
栈指针寄存器的作用:这个寄存器中存放的是栈空间的一块地址,用于压栈保存现场和出栈恢复现场
不同场景下栈的作用
内存划分中的栈:用于存储数据,存放的是局部变量、函数参数.....
数据结构中的栈:用于存储数据,一种特殊的数据结构
arm裸机开发中的栈:用于存储数据,压栈保存现场、出栈恢复现场
栈的特点:在不同的场景下,栈都用于存储数据,并且遵循FILO(先入后出)的特性
R14寄存器
R14寄存器 ---> lr寄存器 ----> the linking register ----> 链接寄存器
作用:用于保存函数的返回地址
R15寄存器
R15寄存器 ----> pc寄存器 -------> the program counter -------> 程序计数寄存器
作用:用于保存下一条取值指令的地址
CPSR寄存器
CPSR寄存器 ----> the currented program statue register -----> 当前程序状态寄存器
作用:用于保存当前程序状态的寄存器
SPSR寄存器
SPSR寄存器 ----> the saved program statue register -----> 备份程序状态寄存器
作用:用于备份当前的程序状态的寄存器
CPSR寄存器中位的作用
N[31]:负数标志位
当指令执行结果为负数时,N位置1,否则清0(可以用于比较大小)
Z[30]:零标志位
当指令执行结果为0时,Z位置1,否则清0(用于判断是否相等)
C[29]:进位/借位标志位
加法:低32位向高32位进位时,C位置1,否则清0
减法:高32位向低32位借位时,C位清0,否则置1
V[28]:符号标志位
当符号位发生变化时,V位置1,否则清0
I[7]:IRQ屏蔽位
i = 1时,屏蔽IRQ(普通中断)
i = 0时,不屏蔽IRQ
F[6]:FIQ屏蔽位
f = 1时,屏蔽FIQ(快速中断)
f = 0时,不屏蔽FIQ
T[5]:状态位
t = 0时,arm状态,执行ARM指令集(32位)
t = 1时,thumb状态,执行thumb指令(16位)
Cortex-A核一般使用的是ARM指令集,Cortex-M核一般使用的是Thumb指令集
M[4:0]:模式位
10000 User mode;
10001 FIQ mode;
10011 SVC mode;
10111 Abort mode;
11011 Undef mode;
11111 System mode;
10110 Monitor mode;
10010 IRQ mode;