目录
1、ARM寄存器
寄存器:是一种特殊的存储器,在CPU内部,可以用来存储数据,但是存储的内容有一定作用。
对于CortexA有40个寄存器,每个寄存器有32bit,寄存器没有地址,用编号来表示。
1.1、CPU内部的存储单元存在单位:
word:字-----------32bit
halfword:半字---16bit
bitByte:字节-----8bit
1.2、通用寄存器(R0-R12)
有小三角的是私有性寄存器,未加小三角的是通用的寄存器

- 未分组寄存器:R0-R12,在所有模式下,未分组寄存器都是指向同一个物理寄存器,如果存在模式转换时,不同的模式都使用相同的寄存器,所以可能造成寄存器的数据破坏,应该工作模式切换时要保存。
- 分组寄存器:R13(SP)、R14(LR) FIQ是 R8-R12,每次访问寄存器都与当前的工作模式相关,不同的模式都有不同的寄存器
- 程序计数器(指令寄存器/程序状态寄存器):R15(PC)
1.2.1、特殊功能寄存器
- R13(堆栈指针寄存器SP),存储栈的栈顶位置地址,与内存相关。
- R14(链接寄存器LR),当程序跳转、函数调用、产生异常。
- R15(程序寄存器PC),当前执行的下一条指令地址,会自动由硬件修改,也可以由我们操作改变。
ARM指令:一条ARM指令有4个字节,所以指令偏移大小为4个字节,指令地址是4的整数倍,所以程序计数器最低2位无效(低2位地址为0-3)。
Thumb指令:大小为2个字节,所以程序计数器最低位无效。
1.3、状态寄存器
程序状态寄存器CPSR、SPSR
- CPSR(程序状态寄存器):存储当前CPU执行程序时的工作状态,CPU在工作时只会有一个工作状态,所以所有的工作模式都是同一个CPSR,所有工作模式都可以访问到CPSR。
- SPSR(程序状态寄存器):备份当前状态的寄存器,保存当前的CPSR值,然后改变CPSR,异常结束时,回到之前的工作模式,就把SPSR的值恢复到CPSR。
1.4、条形码标志

31-28Bit条件码标志 N Z C V都是条件码标志,它们的内容可以被算数运算或逻辑运算的结果修改。
- N : 当两个有符号数〈用补码表示)进行运算时,用N=1表示运算结果为负数,N=0表示运算结果为整数或零
- Z : Z=1表示运算结果为0,Z=0表示运算结果为非O
- C : 运算加法产生进位,减法产生借位,运算加法时,如果产生了进位时C=1,否则C=0,减法运算时,如果产生了借位时C=O,否则C=1。进行包含移位操作的非加法/减法的指令时,C为移出值的最后一位,其他耳加法/减法指令时,C通常不变。
- V :进行有符号位(补码表示)运算时,符号位溢出,V=1。
- 27Bit:Q,ARMV5架构以上的E系列使用,表示增强的DSP运算是否发生了溢出,其他处理器,Q没有意义。
- 24Bit:J,T=0,J=1,处理器是处于JaZelle状态
- 9Bit:E,大小端的控制
- 8Bit:A=1,禁止不精确的数据异常
- 7Bit:I=1,禁止IRQ中断
- 6Bit:F=1,禁止FIQ中断
- 5Bit:T=0,J=0,处理器处于ARM状态(32位指令),解析ARM指令。
T=1,J=0,处理器处于Thumb状态(16位指令)。
T=1,J=1,处理器处于ThumbEE状态
4-0Bit:工作模式
用户模式(user):0B10000----R0-R14、PC、CPSR
快速中断模式FIQ : 0b10001-----RO-R7,R8_FIQ-R14_FIQ, PC,CPSR,SPSR
一般中断模式IRQ:0b10010
管理模式supervisor:0b10011
中止模式abort:0b10111
未定义模式undefined:ob11011系统模式
system:0b11111
Cortex-A特有安全模式monitor:0b10110
1.5、协处理器
ARM体系架构允许通过添加协处理器来扩展指令集,每个协处理器执行指令时,会忽略处理器和其他协处理器的指令当协处理器也不能识别指令时,也会产生未定义异常。
ARM协处理器指令分为三类:
用于ARM处理器初始化ARM协处理器的数据操作
用于ARM处理器的寄存器和ARM协处理器的寄存器之间的数据传输操作
用于ARM协处理器的寄存器和内存之间数据传输操作
1.6、Jazelle状态
在ARM处理器种有Jazelle技术,实现在ARM处理器种能够直接在硬件上提供了对java字节码的支持,提高系统效率。
java字节码就是]B-bits独立架构的指令集
1.7、指令流水线
指令流水线:让CPU内部的多个部件并行工作,以缩短程序的执行时间,提高了处理器的效率,所以处理器架构设计时,其作为最重要的技术进行使用。

三级流水线:
(1)取址(PC取址)
(2)译码
(3)执行

指令的取址、译码、执行的这三个执行过程,将其变成流水线形式执行,就是三级流水线指令。
ARM架构升级,流水线也在增加,但是ARM公司没有提供对应的技术,但是不管是几级流水线都可以按照三级流水线的操作方式来思考。
2、异常
在CPU执行程序(指令)时,有可能会出现意外情况,需要去解决对应的意外情况,就叫做异常
2.1、异常源
在ARM体系结构中设计了7种异常源,ARM架构就需要对这些异常源进行处理,只要执行程序指令时产生对应的异常就会执行对应的异常处理。
只要发生对应的异常时,处理器就会把PC寄存器设置为特定的存储器地址。这个地址被放在称为向量表的范围内,向量表内就是一些跳转操作。即CPU设计了一个向量表来表示每一种异常的处理方式,只要产生异常,PC寄存器就会被设置为向量表种的对应异常的地址,执行异常向量表中的对应指令(跳转执行,执行对应的处理办法)。
ARM异常源
| 异常源 | 对应异常 |
|---|---|
| Reset | 上电执行 |
| undef | 当流水线中某个非法指令被执行(undefined) |
| swi | 当程序执行软中断指令时(supervisor svc) |
| Prefetch | 当指令从内存进行存取指令失败时(abort) |
| Data | 当指令从内存存取数据失败时(abort) |
| IRQ | 一般中断 |
| FIQ | 快速中断 |
2.2、异常产生时发生的硬件操作
2.2.1、保存执行状态
把CPSR寄存器的内容复制到对应产生异常的模式下的SPSR。
2.2.2、模式切换
由硬件自动把cpsr中的模式[4 :0]设置为与异常相对应的值
处理器设置为ARM状态,执行ARM指令
禁止中断,如进入FIQ模式自动把IRQ中断禁止
2.2.3、保存返回地址
把当前的下一条指令的地址保存到 LR_mode寄存器(异常模式下)
2.2.4、跳入异常向量表
强制设置PC寄存器为对应异常向量地址
2.3、异常向量表

异常面量表是一段特定的内存空间,每一种ARM异常都在异常向量中设定出来,对应一个字长空间4Byte(32bit),就是一条ARM指令大小,产生异常时,CPU强制把PC的值设置为对应异常的地址。
当产生异常后,硬件能够完成的操作就只是跳转到异常向量表(d赋值为异常向量地址),剩下的异常处理都是由程序员完成。通常在向量中写一条跳转指令,表示异常应该怎么做,跳转到对应的地址(异常处理地址)执行。
实现异常向量表,完成异常设定。
2.4、异常处理
异常处理是由自己实现的
(1)保存现场(进入异常之前寄存器的值)
将寄存器的值保存到对应异常模式下的栈(内存)(入栈),SP寄存器存栈地址。
(2)执行对应的异常操作
(3)恢复之前现场
当异常处理完,要返回异常之前的状态,继续执行
恢复之前的寄存器数据(从sp对应的栈出栈存储到对应寄存器)
恢复程序运行是的状态cpsr
通过异常逛入时保存的返回地址(Ir寄存器),可以返回到被打断的程序继续执行
-------------------------------------------------到这里已经结束了哦-----------------------------------------------------

本文详细介绍了ARM处理器的寄存器结构,包括通用寄存器、特殊功能寄存器、状态寄存器、协处理器等,并探讨了异常的来源、处理流程和异常向量表,是嵌入式硬件和C语言学习者的重要参考资料。

8349

被折叠的 条评论
为什么被折叠?



