【ARM】寄存器与异常——第二篇

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

目录

1、ARM寄存器

1.1、CPU内部的存储单元存在单位:

1.2、通用寄存器(R0-R12)

1.2.1、特殊功能寄存器

1.3、状态寄存器

1.4、条形码标志

1.5、协处理器

1.6、Jazelle状态

1.7、指令流水线

2、异常

2.1、异常源

2.2、异常产生时发生的硬件操作

2.2.1、保存执行状态

2.2.2、模式切换

2.2.3、保存返回地址

2.2.4、跳入异常向量表

2.3、异常向量表

2.4、异常处理


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寄存器),可以返回到被打断的程序继续执行

-------------------------------------------------到这里已经结束了哦-----------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫漫长夜想学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值