二、ARM相关概念(重点)
2.1 汇编指令
执行一条汇编指令,可以完成某个特定的功能,例如add
2.2 指令集
很多条汇编指令的集合
2.3 架构
不同指令集的版本命名
1)armv1~armV9架构
2)armv1~armv6架构已经淘汰
3)armv7~armv8架构市面上使用比较多
4)armV9架构:2021年刚刚上市
2.4 内核
根据不同的arm架构,设计出不同的arm内核
arm公司不生产芯片,它只是做技术授权,将相应的内核,卖给相应厂商
2.5 SOC
soc:system on chip 片上系统
芯片厂商拿到了arm的授权之后,添加自己需要的外设,就构成了SOC(芯片)
公司 | 架构 | 内核 | SOC |
ST | armv7 | cortex-A7*2 cortex-M4 | stm32mp157AAA |
三星 | armv8 | cortex-A53 | S5P6818 |
高通 | armv8 | Cortex X1 Cortex A78 Cortex A55 | 骁龙888 |
海思 | armv8 | cortex-A77 cortex-A55 | 麒麟9000 |
三、ARM发展史
3.1里程碑1------ARM成立
ARM前身为艾康电脑(Acorn),于1978年,英国剑桥成立,大学的孵化物。
1980年代晚期,苹果开始与艾康合作,开发新版ARM核心。
1985年,艾康开发出全球第一款商用RISC处理器,即ARM1,针对于PC市场,还没有嵌入式呢!!!
1990年,艾康财务危机,受苹果和VLSI(最早做超大规模集成电路的公司)的投资,成立独立子公司:Advanced RISC Machines(ARM),
ARM公司正式成立面世。
3.2 里程碑2------嵌入式RISC处理器
1991年,ARM推出第一款嵌入式RISC处理器,即ARM6。
1993年,发布ARM7。
1997年,发布ARM9TDMI,三星2440基于此内核。
1999年,发布ARM9E,增强型ARM9。
2001年,ARMv6架构。
2002年,发布ARM11微架构。
3.3 里程碑3------微控制器
2004年,发布ARMv7架构的Cortex系列处理器,同时推出Cortex-M3。
2005年,发布Cortex-A8处理器。
2007年,发布Cortex-M1和Cortex-A9
2009年,实现Cortex-A9、发布Cortex-M0
2010年,推出Cortex-M4(F)、成立Linaro
(ARM公司牵头成立的公共组织,专门做ARM处理器在Linux平台上的一些软件的开发和移植),
推出Cortex-A15 MPcore高性能处理器(性能比较高了,但是发热量很大哦)。
3.4 里程碑4------64位处理器时代
2011年,推出32位 Cortex-A7 处理器,ARMv8发布
2012年,开始推出64位处理器。推出 Cortex-M0+、ARM 首款64位处理器架构 Cortex-A53、Cortex-A57 架构。全球第一款64位ARM手机iPhone5s。
2013年,推出32位 Cortex-A12 处理器架构
2014年,推出 Cortex-M7(F) 微控制器架构;32位 Cortex-A17处理器架构。
2015年,推出64位 Cortex-A35、Cortex-A72 处理器架构。
2016年,推出 Cortex-M23 、Cortex-M33(F) 微控制器架构;32位 Cortex-A32 处理器架构;64位 Cortex-A73 处理器架构。
2017年,推出64位 Cortex-A55 、Cortex-A75 处理器架构。
2018年,推出微控制器 Cortex-M35P;64位 Cortex-A76 处理器架构。
四、ARM产品分布(了解)
4.1 cortex-A
高端处理器,可以运行linux操作系统
4.2 cortex-R
只要针对于实时性能,主要应用于汽车电子方面较多
4.3 cortex-M
主要应用于物联网上,裸机开发
五、RISC和CISC区别(重点)
5.1 RISC精简指令集
RISC精简指令集:Reduced Instruction Set Computerr---->编译生成:ARM架构 概念:在复杂指令集中选取一些比较常用或者简单的指令集 特点:指令的周期和指令的宽度是固定的 指令周期:执行一条指令所需要的时间 指令宽度:一条机器码占用的代码段空间 验证方式: $:编译代码:arm-linux-gnueabihf-gcc hello.c $生成反汇编:arm-linux-gnueabihf-objdump -D a.out > hello.dis arm指令集:一条指令占用4个字节空间(arm-linux-gnueabihf-gcc -marm hello.c) thumb指令集:一条指令占用2个字节空间
5.2 CISC复杂指令集
CISC复杂指令集:Complex Instruction Set Computer---->编译生成:X86架构 概念:复杂指令集更注重指令的功能性 特点:指令的周期和指令的宽度是不固定的 验证方式: $:编译代码:gcc hello.c $生成反汇编:objdump -D a.out > hello.dis
六、数据类型约定
6.1 arm-V7架构
数据类型 位数 char(字节) 8bits half word(半字) 16bits word(字) 32bits double word(双字) 64bits
6.2 arm-V8架构
数据类查重型 位数 char(字节) 8bits half word(半字) 16bits word(字) 32bits double word(双字) 64bits qual word(全字) 128bits
七、arm-V7架构和arm-V8架构区别
1.arm-V7架构属于32位架构,arm-V8架构属于64位架构,arm-V8架构向下兼容arm-V7架构 2.arm-V7架构一条指令占用4字节空间,arm-V8架构一条指令占用4字节空间 3.arm-V7架构寻址空间:2^32 arm-V8架构寻址空间:2^64
八、arm处理器工作模式(重点)
1.arm处理器一共有七种工作模式,cortex处理器一共有8种工作模式(monitor工作模式:安全监控模式) 2.在特定的工作模式下,执行特定的代码,完成特定的功能 3.这几种工作模式可以进行切换,可以通过软件编写代码来进行切换 4.系统上电处于SVC模式(SWI软中断指令)
九、ARM寄存器组织(重点)
static:1.限定作用域2.延长生命周期 extern:外部引用 volatile:1.防止编译器对代码进行优化2.去内存中取值,而不是取cache中进行取值
9.1 寄存器
概念:寄存器是处理器内部的存储器,寄存器个数有限,寄存器是没有地址的,寄存器访问通过编号进行访问
9.2 总结
1.每一个小方块代表一个寄存器,一个寄存器为32位(4个字节); 2.每种工作模式下都有自己的寄存器,user模式和system模式共用一套寄存器 3.寄存器白色背景为公有寄存器,寄存器背景为灰色为私有寄存器 如果某个模式下,没有私有寄存器,则可以访问公有寄存器 如果某个模式下,有私有寄存器,则不可以访问公有寄存器 4.寄存器的空间有限,寄存器的个数有限,寄存器的访问是通过编号进行访问的,r0~r15,CPSR,SPSR 5.arm处理器寄存器个数:37个寄存器 cortex处理器寄存器个数:43个寄存器
十、特殊功能寄存器(重点)
10.1 sp--->the stack pointer
(r13)别名sp:栈指针寄存器 作用:用来指向栈空间的地址
10.2 lr--->the linking register
r14别名lr:链接寄存器 作用:保存函数的返回地址
10.3 pc--->program counter
r15别名PC:程序计数器 作用:保存当前取址指令的地址
10.4 cpsr-->currented program statued register
cpsr:当前程序状态寄存器
10.5 spsr-->saved program statued register
spsr:保存程序状态寄存器,对CPSR进行备份
十一、CPSR寄存器详解(重点)
1.N[31]:指令的执行结果为负数,N位会被自动置1,否则清0 2.z[30]:指令的执行结果为零,z位会被自动置1,否则清0 3.C[29]: 加法:产生进位,C位会被自动置置1,否则清0 进位:低32位寄存器,向高32位寄存器进行进位 减法:产生借位,C位会被自动置清0,否则置1 借位:低32位寄存器,向高32位寄存器进行借位 4.V[28]:符号位发生变化,V位会被自动置置1,否则清0 5.I[7]:IRQ中断屏蔽位 I=1:中断屏蔽 I=0:不中断屏蔽 6.F[6]:FIQ中断屏蔽位 F=1:中断屏蔽 F=0:不中断屏蔽 7.T[5]:状态位 T=0:ARM状态,执行arm指令集 T=1:thumb状态,执行thumb指令集 8.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;
十二、指令流水线(了解)
作用:提高代码的执行效率
12.1 取址器
根据PC寄存器中的值,完成取址的操作
12.2 译码器
翻译指令的执行功能,给到对应的执行器
12.3 执行器
执行一条指令,完成某个特定的功能,并将指令的执行结果写到对应的寄存器中
指令1 | 指令2 | 指令3 | 指令4 | 指令5 | 指令6 | |
1T | 取指 | |||||
2T | 译码 | 取指 | ||||
3T | 执行 | 译码 | 取指 | |||
4T | 执行 | 译码 | 取指 | |||
5T | 执行 | 译码 | 取指 | |||
6T | 执行 | 译码 | 取指 | |||
7T | 执行 | 译码 | ||||
8T | 执行 |