*********************************
预备知识
*********************************
【1】逻辑0和1:高电平表示1
低电平你表示0
【2】二极管
特性,单向导电性,正向导通,反向截止
【3***】三极管
特性:放大特性,开关特性
NPN:高电平导通,低电平截止
PNP:低电平导通,高电平截止
【4*****】位和位域的操作
位运算符:& | ^ ~ << >>
逻辑运算符:&& || !
1> unsigned int a;
将a的第15位置1,其他位不变
总结:或1置1,或0不变
31 0
******** ******** 1******* ********
a = a | 0x8000;
二进制转换为十六进制:
**** 二进制
8421
a |= 0x8000;
a = a | (1 << 15);
2> unsigned int a;
将a的第15位清0,其他位不变
总结:与0清0,与1不变
******** ******** 1******* ********
11111111 11111111 01111111 11111111
a = a & 0xFFFF7FFF;
a = a & (~(1 << 15));
a = a & (0x0 << 15);切记不要使用,错误
位域操作:
位域:几个连续的位,称为位域--->[7:4]
1>unsigned int a;
将a的[7:4]清0,其他位不变
******** ******** ******** 1111****
00000000 00000000 00000000 00001111 0xF
00000000 00000000 00000000 11110000 0xF << 4
11111111 11111111 11111111 00001111 ~(0xF << 4)
a = a & (~(0xF << 4));
2>unsigned int a;
将a的[7:4]置1,其他位不变
a = a | (0xF << 4);
3>unsigned int a;
将a的[7:4]修改为1010,其他位不变
1. 先清零,
a = a & (~(0xF << 4));
2. 再把相应的位置1
a = a | (0xa << 4);
a = a & (~(0xF << 4)) | (0xa << 4);
a &= (~(0xF << 4)) | (0xa << 4); 错误
#############################
1. 先置1
a = a | (0xF << 4);
2. 再把相应的位清0
a = a & (~(0x5 << 4));
4>unsigned int a;
将a的[9:4]修改为101010,其他位不变
a = a & (~(0x3F << 4)) | (0x2a << 4);
总结:与0清零,或1置1,异或1取反
先清零,后把相应的位置1
###########################################
ARM体系结构
###########################################
【1】面试题:谈谈你对ARM的理解
1. ARM代表一个公司
ARM公司只做技术的授权,不生产芯片
2. ARM代表一种技术,采用精简指令集(RISC)的内核
3. 携带ARM核的处理器,统称ARM处理器
内核:ARM7 ARM9 ARM11 Cortex-A:a7 a8 a9 a53 a75 a76
架构:arm-v3 arm-v4,arm-v5,arm-v6,arm-v7,arm-v8
arm-v7 : 32位架构 ---》 cortex-a9 exynos-4412
arm-v8 : 64位架构 ---》 cortex-a53 s5p6818
CPU:处理器
三星:s5p6818 8*a53 arm-v8
高通:骁龙855 4*A76+4*A55 arm-v8
华为:麒麟980 4*A76+4*A55 arm-v8
飞思卡尔:IMX6 4*a9 arm-v7
SOC:system of chip 片上系统
s5p6818
骁龙855
麒麟980
IMX6 以上芯片都可以叫SOC
ARM公司研发架构--->研发内核--》授权芯片公司
--》芯片公司给予内核添加外设,研发出自己的SOC
--》给这个SOC定义一个名字
【2】ARM发展历史
1979年 Acorn
1985年 32位 8MHz RISC 名字:ARM
ARM:Acorn RISC Machine
1990年:iphone 125万英镑
VLSI 25英镑
12工程师+技术专利 125万英镑
名字:ARM公司 Advanced RISC Machine
2016年:软银
【3】RISC和CISC区别
RISC:精简指令集
选取了一些比较常用简单的指令,
指令的功能简单,指令的宽度固定,
指令的周期固定,多为单周期指令
指令的宽度固定:单条指令存储在内存中,
占用多大的空间
CISC:复杂指令集(X86)
注重指令的功能性,指令的宽度不固定,
指令的周期不固定
###########################################
【1】回顾
1. 二极管 三极管
2. 位和位域的操作
3. ARM的认识
【2】ARM公司产品分布
Cortex-A:嵌入式,高端芯片,跑操作系统
linux内核
Cortex-R:针对实时性
Cortex-M:简单的电子产品,不跑操作系统
小型的实时操作系统:FreeRTOS,ucos III
【3】ARM约定数据所占空间
arm-v7
字节--》8bits
半字--》16bits
字 --》32bits
doubleword --》64bits (arm-v7)
quadword --》128位(arm-v8)
【4】ARM处理器32位和64位的区别
位数指:一条指令可以完成多少位数据的计算
ARMv7:
ARM指令集 每条指令占32位内存空间
Thumb指令集 每条指令占16位内存空间
ARMv8:
Aarch64 每条指令占32位内存空间
Aarch32 每条指令占32位内存空间
T32 每条指令占16位内存空间
T16 每条指令占16位内存空间
【5】ARM处理器的工作模式
ARM7、ARM9、ARM11 有7种基本工作模式:
cortex-a 有8种基本工作模式:
User : 非特权模式,大部分任务执行在这种模式
FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式
IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式
Supervisor :当复位或软中断指令执行时将会进入这种模式
Abort : 当存取异常时将会进入这种模式
Undef : 当执行未定义指令时会进入这种模式
System : 使用和User模式相同寄存器集的特权模式
Cortex-A特有模式:
Monitor : 是为了安全而扩展出的用于执行安全监控代码的模式;
也是一种特权模式
总结:特定的模式下,执行特定的代码,完成特定的功能
【6】ARM寄存器组织
每种模式下,只能使用自己模式下的寄存器,
cortex-a总共有40个寄存器
ARM7,9,11总共有37个寄存器
R0-R15,cpsr spsr
ARMv7-》每个寄存器可以存放32位数据
ARMv8-》A64-》每个可以存放64位数据
A32-》每个可以存放32位数据
寄存器由ARM公司提供的,每个寄存器可以存放一个
32位(64位)的数据,这个存放数据的空间没有地址。
每个地址都给了一个编号--》r0-r15,cpsr,spsr
r0-r15,cpsr,spsr寄存器表示地址空间。
r13->sp the stack pointer
栈指针寄存器
栈顶的地址
r14->lr the link register
链接寄存器
存放程序的放回地址
r15->pc the program counter register
程序计数寄存器
存放当前取指指令的地址
ARM指令--》PC自动加4 (以字节对齐)
Thumb指令--》PC自动加2
cpsr-> current program status register
当前程序的运行状态
ARM状态 THUMB状态
当前程序的运行模式
spsr-> saved program status register
保存程序状态寄存器
用于保存cpsr
【7】CPSR寄存器详解
N[31]:运算结果为负数 N位被自动置1,否则为0、
Z[30]:运算结果为0 Z位被自动置1,否则为0
c[29]:
加法:如果产生进位,C位被自动置1,否则为0
进位:低32位向高32位进位
减法:如果产生借位,C位被自动清0,否则为1
借位:低32位向高32位借位
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状态
T = 1:Thumb状态
M[4:0]:模式位
10000 User mode;
10001 FIQ mode;
10010 IRQ mode
10011 SVC mode;
10111 Abort mode;
11011 Undfined mode;
11111 System mode;
10110 Monitor mode;
【8】PC程序计数寄存器
当前程序处于ARM状态,执行ARM指令集
ARM指令每条指令占32位内存空间
ARM指令必须以字为单位对齐
指令存放的地址,地址必须为4的整数倍
PC值由[31:2]位决定,[1:0]位没有定义
(所以指令不能halfword / byte对齐).
0b0000 0000
0b0000 0100
0b0000 1000
0b0000 1100
……
当前程序处于Thumb状态,执行Thumb指令集
Thumb指令每条指令占16位内存空间
Thumb指令必须以半字为单位对齐
指令存放的地址,地址必须为2的整数倍
PC值由[31:1]位决定,[0]位没有定义
0b0000 0010
0b0000 0100
0b0000 0110
0b0000 1000
……
【9】大小端对齐
大端对齐:低地址放高有效位,高地址放低有效位
小端对齐:低地址放低有效位,高地址放高有效位
ARM采用的小端对齐
【10】三级流水线
取指 译码 执行
取指:从地址中将指令取出,交给译码器
译码:翻译指令,交给执行器
执行:完成一定的功能,将结果返回给寄存器
取指器,译码器,执行器:三个独立的硬件,执行互不干扰。
每个都是单周期的器件。
周期 指令1 指令2 指令3 指令4 指令5
1 取指
2 译码 取指
3 执行 译码 取指
4 执行 译码 取指
5 执行 译码 取指
6 执行 译码
7 执行
ARM7:三级流水线
ARM9:五级流水线
ARM10:六级流水线
ARM11::八级流水线
cortex-a9:十三级流水线
cortex-a53:简单的8级流水线