ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供0.9MIPS/MHZ的指令执行速度
PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:1、取指(从存储器装载一条指令);2、译码(识别将要被执行的指令,得到下一指令占据数据路径,寄存器被读取,操作数在桶式移位器中被以为。ALU产生相应的运算结果并写回到目的寄存器中,ALU结果根据指令需求更改状态寄存器的条件位)。而R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前指令第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;详细分解:
第一周期对第一指令进行取指操作。
第二周期对第一指令进行译码,同时对第二指令进行取指操作。
第三周期对第一指令进行执行,第二指令进行译码,并同时对第三条指令执行操作
地址 指令
0x3000 A
0x3004 B
0x3008 C
0x300c D
(1)SWI和未定义指令异常
此时正在执行指令A(此时PC=0x3008)的同时在译码阶段发生SWI或未定义指令异常,等指令A执行完后(此时PC还没有发生改变PC=0x3008)进行SWI或未定义指令粗合理,同时把当前PC值赋给寄存器LR(LR=0x3008)然后再进行自动调整LR=LR-0x04(此时LR=0x3004),这样当异常返回时就到地址为0x3004的指令处执行。所以再进入异常的时候LR不需要修改
(2)IRQ和FIQ异常
此时正在执行指令A(此时PC=0x3008)的同时发生IRQ和FIQ异常,等指令A执行完后(此时PC发生改变PC=0x300c)进行IRQ和FIQ异常响应,同时把当前PC值赋给寄存器LR(LR=0x300c)然后再进行自动调整LR=LR-0x04(此时LR=0x3008),这样当异常返回时就到地址为0x3008的指令C处执行(可以看出跳过了执行指令B),所以当进入异常的时候要执行“SUB LR,LR,#4”(此时LR=0x3004),当异常返回时就到地址为0x3004的指令B处执行。
(3)预取指令中止
此时正在执行指令A(此时PC=0x3008)发生预取指令中止异常,(此时PC没有发生改变PC=0x3008)进入预取指令中止异常响应,同时把当前PC值赋给寄存器LR(LR=0x3008)然后再进行自动调整LR=LR-0x04(此时LR=0x3004),这样当异常返回时就到地址为0x3004的指令B处执行,但是当发生指令预取中止异常时,程序要返回到该有问题的指令处,重新读取并执行该指令。异常指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处。所以当进入异常的时候要执行“SUB LR,LR,#4”(此时LR=0x3000),当异常返回时就到地址为0x3000的指令A处重新执行
(4)数据中止异常
此时正在执行指令A(此时PC=0x3008)的同时发生数据中止异常,等指令A执行完后进入下一条指令时(此时PC发生改变PC=0x300c)发生数据中止异常响应,同时把当前PC值赋给寄存器LR(LR=0x300c)然后再进行自动调整LR=LR-0x04(此时LR=0x3008),这样当异常返回时就到地址为0x3008的指令c处执行,但是发生数据访问中止异常中断时,程序要返回到该有问题的数据访问处,重新访问该数据。因此数据访问中止异常中断程序应该返回到产生该数据访问中止异常中断的指令处所以当进入异常的时候要执行“SUB LR,LR,#8”(此时LR=0x3000),当异常返回时就到地址为0x3000的指令A处重新执行
异常或入口
|
返回指令
|
之前的状态
ARM R14_x Thumb R14_x
|
备注
|
BL
|
MOV PC,R14
|
PC+4
|
PC+2
|
此处PC 为BL, SWI, 未定义的指令取指或者预取中止指令的地址。
|
SWI
|
MOVS PC,R14_svc
|
PC+4
|
PC+2
|
未定义的指令
|
MOVS PC,R14_und
|
PC+4
|
PC+2
|
预取中止
|
SUBS PC,R14_abt,#4
|
PC+4
|
PC+4
|
快中断
|
SUBS PC,R14_fiq,#4
|
PC+4
|
PC+4
|
此处PC 为由于FIQ 或IRQ 占先而没有被执行的指令的地址
|
中断
|
SUBS PC,R14_irq,#4
|
PC+4
|
PC+4
|
数据中止
|
SUBS PC,R14_abt,#8
|
PC+8
|
PC+8
|
此处PC 为产生数据中止的装载或保存指令的地址。
|
复位
|
无
|
-
|
-
|
复位时保存在R14_svc 中的值不可预知。
|
分享到:
相关推荐
arm中断返回地址详细分析归类.pdf
5级流水线和6级流水线ARM组织.pdf 学习资料 复习资料 教学资源
ARM流水线详解,包含两个文档:ARM流水线关键技术分析与代码优化和ARM流水线阐述。相信看完这两个文档能深入了解ARM流水线的原理。
ARM异常中断以及对ARM异常返回地址的分析
3级流水线ARM组织.pdf 学习资料 复习资料 教学资源
讲述ARM类CPU流水线工作原理,适用于刚刚接触初学的同学
流水线技术通过多个功能部件并行工作来缩短...ARM7处理器核使用了典型三级流水线的冯•诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构。通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能。
ARM单片机是大多数新手选择的入门切入点,但由于知识的不足,在设计过程中新手们经常会遇到这样或那样的问题,ARM异常中断返回就是这样一种令人头疼的问题。在ARM的使用问题中异常中断返回是新手们较为苦恼的问题,...
在ARM的使用问题中异常中断返回是新手们较为苦恼的问题,本文就将对ARM异常中断的集中情况进行总结,并给出了一些解决方法。
本文主要对ARM中断模式(IRQ)和快速中断模式(FIQ)区别进行了说明,希望对你的学习有所帮助。
ARM 中断程序的原理和实现ARM 中断程序的原理和实现
这是一个基于arm9的裸机程序开发的流水灯,中断定时,响应中断。
arm外中断实验 跳线LED1、Key1和Beep分别连接到P1.18、P0.16和P0.7管脚;使用KEY1模拟外中断; 启动ADS 1.2,使用ARM Executable Image for lpc2131工程模板建立一个工程TimeEINT_C。 在user 组中的main.c 中编写主...
ARM S3C2440 外部中断 赵春江老师经典讲解,很详细机体,非非常不错哦。
ARM7的控制芯片,LPC2138 通过控制定时器的时间来控制流水灯的移动速度 Proteus仿真文件+C源代码+值得你的5分
Arm 中断管理基于ucosIII的源码,清晰地展现基本的中断管理操作,可用KeilC编译。
ARM 7,有三级流水线,对于初学流水线芯片设计的学生来说,是个很好的教例!
ARM CORTEX-M3程序进入错误中断调试笔记
ARM__中断学习 ARM__中断学习 ARM__中断学习 ARM__中断学习
适合初学者的,基于s3c2440的按键中断程序