一,ARM 3级指令流水线特点
“指令”:给CPU核下发的执行动作的命令 —— 例如:add指令,就是让CPU核进行数据的加法运算+指令3级流水线的过程和涉及的如下三个硬件单元:
取值:取值器将内存中的指令加载到CPU核中
解码:解码器将加载的指令翻译成CPU核将来能够识别的真正的指令
执行:CPU核最终执行下发的指令
PC永远指向取值,也就是PC永远保存取值指令的地址。ARM指令集的位宽为32位(4字节) , THUMB指令集的位宽为16位(2字节)
二,ARM 5级指令流水线特点
ARM9以后,指令流水线一律采用5级流水线,3级流水线(F->D->E)中没有把M(访存)和 W(写会)合法化。比如:add,sub,orr,eor,and等没有M和W。 只有ldr才有 到5级流水线,任何指令都有M和W(终于合法了) ,但是类似add,sub等指令即使没有M(访问动作) +但是对应的周期必须要存在。
三,ARM CPU核处理器的7种工作模式
工作模式 |
场景 |
SVC管理模式 |
复位或者CPU执行swi指令,CPU就会切换到SVC管理模式,此模式的权限最高! |
FIQ快速中断模式 |
外设产生中断电信号,经过中断控制器,中断控制器再以FIQ发送给CPU,CPU切换到FIQ快速中断模式 |
IRQ中断模式 |
外设产生的中断电信号,经过中断控制器,中断控制器再以IRQ发送给CPU,CPU切换到IRQ中断模式 切记:外设产生的中断电信号不能直接给CPU,必须要经过中断控制器,中断控制器会对这个中断信号 +进行一番的判断最终觉得是否发送给CPU或者以什么样的方式(FIQ/IRQ)发送给CPU |
Abort终止模式 |
CPU访问一个不存在内存地址或者访问的数据权限不够,CPU会切换到Abort终止模式 |
Undef未定义模式 |
CPU执行一个不认识的指令,例如CPU执行zhangsan指令,CPU不认识此指令,CPU切换到未定义指令模式 |
System系统模式 / User模式: |
这两个模式一样,系统运行时,应用程序一般都是在User模式运行前者的权限稍微高于User,但是在7种工作模式中权限最低 |
四,ARM的7种异常
异常 |
对应场景 |
对应CPU模式 |
复位异常 |
系统复位 |
SVC管理模式 |
未定义指令异常 |
指令CPU不识别 |
Undef未定义指令模式 |
软中断异常 |
CPU执行swi指令 |
SVC管理模式 |
预取指令异常 |
访问内存失败 |
Abort终止模式 |
数据处理异常 |
数据的访问权限不够 Abort终止模式 |
|
IRQ异常 |
外设给CPU发IRQ中断 IRQ模式 |
|
FIQ异常 |
外设给CPU发FIQ中断 FIQ模式 |
一旦发生异常,ARM核硬件上自动完成:
1.保存CPSR到SPSR_mode(对应的工作模式下的spsr) 保存是为了将来能够返回继续执行
2.设置CPSR的相应位
设置BIT[5]=0, 切换到ARM状态。
设置BIT[4:0]=mode, 切换到某个CPU的工作模式下。
设置BIT[7:6]=11, 禁止IRQ和FIQ中断。
3.保存返回地址到lr_mode为了将来能够返回到原来被打断的地方继续执行、 设置PC为相应异常的软件处理入口地址,也就是让CPU到某个地址去"运行",开启软件处理异常。软件处理异常,怎么处理,完全由开发者自己决定。
4.软件一旦处理异常完毕,一般要返回,返回需要软件实现:
(1)将spsr_mode赋值给cpsr(2)将lr_mode(保存着跳转之前的地址)赋值给pc 等于让CPU继续到跳转之前的地址去运行
五,ARM寄存器之CPSR(当前程序状态寄存器):位宽32位。
BIT[4:0]: 又称MODE位,指示当前程序对应的CPU的工作模式
BIT[5]:又称状态位(T),指示当前CPU的工作状态。=0:ARM状态。=1:Thumb状态。
BIT[6]:又称F位。=0,使能FIQ中断。=1,禁止CPU核相应FIQ中断。
BIT[7]:又称I位。=0,使能IRQ中断。=1,禁止CPU核相应IRQ中断 。
BIT[28]:又称V位。=0:程序执行无溢出 。=1:程序执行溢出。
BIT[29]:又称C位。=0:没有发生借位或者进位。=1:有发生过进位或者借位。
BIT[30]:又称Z位。=0:程序运算结果为非0。=1:程序运算结果为0。
BIT[31]:又称N位。=1:程序运算结果为负数或者小于 。=0:否则
N,Z,C,V:由统称条件标志位 。影响CPSR的条件标志位的情形:指令后面加S,指令的运算结果影响cpsr的NZCV位。
例如:
add r0, r0, r1 //r0=-1, r1=1 //结果r0不影响cpsr的NVZV 。
adds r0,r0,r1 //会影响。
ARM寄存器之SPSR(保存当前程序状态寄存器) 位宽也是32位,用来保存CPSR,当CPU正在运行某个进程,此时CPU的工作模式为 +User模式,此时UART控制器给CPU发送一个IRQ中断,CPU相应IRQ中断,伴随着CPU由User模式切换到IRQ模式,但是在切 +换之前,应该保存当前进程的运行状态(否则将来再返回就没法继续运行),只需将cpsr保存在IRQ模式下的spsr下,将来中断处理完毕以 +后,再将IRQ模式下的spsr给cpsr,恢复到之前被打断的进程的状态 。