ARM技术与ARM体系结构_第1页
ARM技术与ARM体系结构_第2页
ARM技术与ARM体系结构_第3页
ARM技术与ARM体系结构_第4页
ARM技术与ARM体系结构_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章ARM技术与ARM体系结构本章主要介绍ARM处理器的产生及版本发展历史,以及各个版本的典型处理器及应用情况和性能分析;ARM处理器的内核调试结构,重点分析了ARM7TDMI-S、ARM9TDMI两种结构;ARM处理器的工作模式及寄存器组织结构,分析了在什么情况下进入到相应的工作模式;ARM处理器支持的内存数据存储格式,分为大端格式和小端格式;最后介绍了ARM7的三级流水线运行机制和ARM9的五级流水线运行机制。

内容提要2.1ARM体系结构版本与内核2.2ARM内核模块2.3ARM处理器的工作模式2.4ARM内部寄存器2.5ARM异常处理2.6存储方式与存储器映射机制2.7ARM流水线技术分析2.1ARM体系结构版本与内核第一片ARM处理器是1983年10月到1985年4月间在位于英国剑桥的AcornComputer公司开发1990年,ARM公司成立20世纪90年代,ARM快速进入世界市场1995年StrongARM问世XScale是下一代StrongARM芯片的发展基础ARM10TDMI是ARM处理器核中的高端产品ARM11是ARM家族中性能最强的一个系列2.1.1ARM体系结构版本ARM7TDMI4T1支持Halfword和signedhalfword/byte和Systemmode支持Thumb指令集24ARM9TDMIARM720TARM940T改良的ARM/Thumb交互作用以及CLZ指令5TESaturatedmathsDSPmultiply-accumulateinstructionsXScaleARM1020EARM9E-SARM966E-S3早期的ARMsARM9EJ-S5TEJARM7EJ-SARM926EJ-SJazelle支持Java字节码

6ARM11SIMDSISIMDMDSSIMD7ARMCotex第一阶段:版本V1、V2、V3这3个早期ARM版本功能单一,没有大范围占领市场,主要是处于开发和实验阶段第二阶段:从ARM4开始,ARM体系结构处于完善和提高阶段版本4与以前版本相比增加了下列指令:

有符号、无符号的半字和有符号字节的load和store指令。增加了T变种,处理器可以工作于Thumb状态,在该状态下的指令集是16位的Thumb指令集。增加了处理器的特权模式。在该模式下,使用的是用户模式下的寄存器。

版本5主要由两个变型版本5T、5TE组成相比与版本4,版本5的指令集有了如下的变化:提高了T变种中ARM/Thumb混合使用的效率。增加前导零记数(CLZ)指令,该指令可使整数除法和中断优先级排队操作更为有效;增加了BKPT(软件断点)指令;为协处理器设计提供了更多的可供选择的指令;更加严格地定义了乘法指令对条件码标志位的影响。

ARM体系版本6是2001年发布的。新架构v6在降低耗电量的同时还强化了图形处理性能。通过追加有效进行多媒体处理的SIMD功能,将语音及图像的处理功能提高到了原机型的4倍。ARM体系版本6首先在2002年春季发布的ARM11处理器中使用。2.1.2ARM体系结构的基本版本命名规则ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}大括号内的字母是可选的,各个字母的含义如下:

x ——系列号,例如ARM7中的“7”、ARM9中的“9”;

y ——内部存储管理/保护单元,例如ARM72中的“2”、ARM94中的“4”;

z ——内含有高速缓存Cache;

T ——技持16位的Thumb指令集;

D ——支持JTAG片上调试;

M ——支持用于长乘法操作(64位结果)的ARM指令,包含快速乘法器;

I ——带有嵌入式追踪宏单元ETM(EmbeddedTraceMacro),用来设置断点和观察点的调试硬件;续

E ——增强型DSP指令(基于TDMI);

J ——含有Java加速器Jazelle,与Java虚拟机相比,Java加速器Jazelle使Java代码运行速度提高了8倍,功耗降低到原来的80%;

F ——向量浮点单元;S——可综合版本,意味着处理器内核是以源代码形式提供的。这种源代码形式又可以被编译成一种易于EDA工具使用的形式。ARM体系结构的基本版本版本版本变种系列号处理器核V1V1ARM1ARM1V2V2ARM2ARM2V2aARM2aSARM3ARM3V3V3ARM6ARM6、ARM600、ARM610ARM7ARM7、ARM700、ARM710V4V4TARM7TDMI、ARM710T、ARM720T、ARM740TV4ARM8StrongARM、ARM8、ARM810V4TARM9ARM9TDMI、ARM920T、ARM940TV5V5TEARM9E-SARM10ARM10TDMI、ARM1020EV6V6ARM11ARM11、ARM11562-S、ARM1156T2F-S、ARM11JZF-SV7V7ARMCotexARMCotex-A8、ARMCotex-R4、ARMCotex-M32.2ARM内核模块ARM处理器一般都带有嵌入式追踪宏单元ETM(EmbeddedTraceMacro),它是ARM公司自己推出的调试工具ARM调试结构2.2.1 ARM7TDMI-S内核结构ARM7TDMI-S是一款32位嵌入式RISC处理器。它作为优化的硬核是性能、功耗和面积特性的最佳组合。使用ARM7TDMI核使得系统设计师能够设计出小尺寸、低功耗以及高性能的嵌入式设备。ARM7TDMIARM7TDMI是基于ARM7内核3级流水线0.9MIPS/MHz冯.诺依曼架构CPI(CyclePerInstruction)约为1.9T-Thumb架构扩展,提供两个独立的指令集:ARM指令,均为32位Thumb指令,均为16位两种运行状态,用来选择哪个指令集被执行D-内核具有Debug扩展结构M-增强乘法器支持64位结果.I-EmbeddedICE-RT逻辑提供片上断点和调试点支持ARM7TDMI内核信号ARM7TDMI内核MCLKnIRQnFIQnRESETBUSENBIGENDISYNCnWAITVDDVSSAPEDBE协处理器接口存储器管理存储器接口ABORTnOPCCPBCPAnCPInTRANSnM[4:0]MAS[1:0]nRWnMREQLOCKSEQnENOUTA[31:0]DOUT[31:0]DIN[31:0]D[31:0]电源总线控制时钟配置中断ARM7TDMI方框图ARM7TDMI内核TAP

控制器JTAG接口数据总线控制信号D[31:0]地址总线A[31:0]DIN[31:0]DOUT[31:0]BUSSplitterEmbeddedICE逻辑乘法器ARM7TDMI内核指令解码地址自增器nRESETnMREQSEQABORTnIRQnFIQnRWMAS[1:0]LOCKnCPICPACPBnWAITMCLKnOPCBIGENDISYNCnTRANSnM[4:0]D[31:0]桶形移位器32位ALUDBE写数据寄存器读数据寄存器地址寄存器寄存器A[31:0]ABE及控制逻辑PCUpdate解码站指令解码IncrementerPCABusBBusALUBus外部地址产生PC[31:2]ARMStatePC[31:1]ThumbStateALU[31:0]INC自增器A[31:0]向量0x1C0x00地址寄存器特点:32/16位RISC架构(ARMv4T)。具有最高性能和灵活性的32位ARM指令集。代码紧凑的16位Thumb指令集。统一的总线接口,指令与数据都在32位总线上传输。3级流水线。32位算术逻辑单元(ALU)。极小的核心尺寸以及低功耗。完全的静态操作。协处理器接口。扩展的调试设备:T标志位的作用161632-bitdata16A[1]MuxThumb指令解码MuxMuxT标志ARM指令解码阶段1阶段2D[31:0]0110FetchDecodeExecute带Cache的ARM7TDMIARM710T8K统一的cache完整的内存管理单元(mmu),支持虚拟地址和存储器保护写缓冲ARM720T同ARM710T,但支持WinCEARM740T8K统一的cache内存管理单元写缓冲ARM7TDMI内核地址地址数据读AMBA

接口写缓冲MMU数据写数据ARM7xxT控制逻辑CacheAMBA总线接口JTAG和非AMBA信号CP15ARM7系列内核采用了三条流水线的内核结构,三级流水线分别为取指(Fetch)、译码(Decode)、执行(Execute)

取指:将指令从存储器中取出,放入指令Cache中。译码:由译码逻辑单元完成,是将在上一步指令Cache中的指令进行解释,告诉CPU将如何操作。执行:这阶段包括移位操作、读通用寄存器内容、输出结果、写通用寄存器等。需要注意的是,PC指向正被取指的指令而不是正在执行的指令:详细信息见教材《ARM嵌入式系统结构与编程》第16页2.2.2ARM9内核结构ARM920是一款32位嵌入式RISC处理器内核。在指令操作上采用5级流水线.取指:从指令Cache中读取指令。译码:对指令进行译码,识别出是对哪个寄存器进行操作并从通用寄存器中读取操作数。执行:进行ALU运算和移位操作,如果是对存储器操作的指令,则在ALU中计算出要访问的存储器地址。存储器访问:如果是对存储器访问的指令,用来实现数据缓冲功能(通过数据Cache)。寄存器回写:将指令运算或操作结果写回到目标寄存器中。ARM920的5级流水线操作2.3ARM处理器的工作模式ARM技术的设计者将ARM处理器在应用中可能产生的状态进行了分类,并针对同一类型的异常状态设定了一个固定的入口点,当异常产生时,程序会自动跳转到对应异常入口处进行异常服务。ARM处理器共有7种工作模式1.用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式2.FIQ模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优先级(fast)中断产生时将会进入这种模式。3.IRQ模式:也称为普通中断模式,:当一个低优先级(normal)中断产生时将会进入这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中断处理都在IRQ模式下进行。4.SVC模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入这种模式。5.中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟存储或存储保护。6.未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协处理器的操作上。7.系统模式:使用和User模式相同寄存器组的特权模式,用来运行特权级的操作系统任务。在这7种工作模式中,除了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。在这6种特权模式中,除了系统模式外的其他5种特权模式又称为异常模式,每种异常都对应有自己的异常处理入口点。2.4内部寄存器ARM处理器共有37个寄存器,这些寄存器包括以下两类寄存器。(1)31个通用寄存器:包括程序计数器PC等,这些寄存器都是32位寄存器。(2)6个状态寄存器:状态寄存器也是32位的寄存器,但是目前只使用了其中的14位。r0r1r2r3r4r5r6r7r8r9r10r11r12r13(sp)r14(lr)r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrFIQIRQSVCUndefAbortUserModer0r1r2r3r4r5r6r7r8r9r10r11r12r13(sp)r14(lr)r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrentVisibleRegistersBankedoutRegistersFIQIRQSVCUndefAbortr0r1r2r3r4r5r6r7r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrentVisibleRegistersBankedoutRegistersUserIRQSVCUndefAbortr8r9r10r11r12r13(sp)r14(lr)FIQModeIRQModer0r1r2r3r4r5r6r7r8r9r10r11r12r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrentVisibleRegistersBankedoutRegistersUserFIQSVCUndefAbortr13(sp)r14(lr)UndefModer0r1r2r3r4r5r6r7r8r9r10r11r12r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrentVisibleRegistersBankedoutRegistersUserFIQIRQSVCAbortr13(sp)r14(lr)SVCModer0r1r2r3r4r5r6r7r8r9r10r11r12r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrentVisibleRegistersBankedoutRegistersUserFIQIRQUndefAbortr13(sp)r14(lr)AbortModer0r1r2r3r4r5r6r7r8r9r10r11r12r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsr当前可见寄存器备用寄存器UserFIQIRQSVCUndefr13(sp)r14(lr)ARM寄存器寄存器组织概要User

mode

r0-r7,

r15,

and

cpsrr8r9r10r11r12r13(sp)r14(lr)spsrFIQr8r9r10r11r12r13(sp)r14(lr)r15(pc)cpsrr0r1r2r3r4r5r6r7Userr13(sp)r14(lr)spsrIRQUser

mode

r0-r12,

r15,

and

cpsrr13(sp)r14(lr)spsrUndefUser

mode

r0-r12,

r15,

and

cpsrr13(sp)r14(lr)spsrSVCUser

mode

r0-r12,

r15,

and

cpsrr13(sp)r14(lr)spsrAbortUser

mode

r0-r12,

r15,

and

cpsrThumbstateLowregistersThumbstateHighregistersNote:System模式使用user模式寄存器集ARM寄存器ARM有37个32-Bits长的寄存器.1个用作PC(programcounter)1个用作CPSR(currentprogramstatusregister)5个用作SPSR(savedprogramstatusregisters)30个通用寄存器当前处理器的模式决定着哪组寄存器可操作.任何模式都可以存取:相应的r0-r12子集相应的r13(thestackpointer,sp)andr14(thelinkregister,lr)相应的r15

(

theprogramcounter,pc)相应的CPSR(currentprogramstatusregister,cpsr)特权模式(除system模式)还可以存取;相应的spsr(savedprogramstatusregister)程序状态寄存器

条件位:N=

1-结果为负,0-结果为正或0Z=1-结果为0,0-结果不为0C=1-进位,0-借位V=1-结果溢出,0结果没溢出Q位:仅ARM5TE/J架构支持指示增强型DSP指令是否溢出J位仅ARM5TE/J架构支持J=1:处理器处于Jazelle状态中断禁止位:I=1:禁止IRQ.F=1:禁止FIQ.TBit仅ARMxT架构支持T=0:处理器处于ARM状态T=1:处理器处于Thumb状态Mode位(处理器模式位):0b10000 User0b10001 FIQ0b10010 IRQ0b10011 Supervisor0b10111 Abort0b11011 Undefined0b11111 System2731NZCVQ2867IFTmode1623

815

54024

UndefinedJ当处理器执行在ARM状态:所有指令32bits宽所有指令必须word对齐所以pc值由bits[31:2]决定,bits[1:0]未定义(所以指令不能halfword/byte对齐).程序指针PC(r15)当处理器执行在Thumb状态:所有指令16bits宽所有指令必须halfword对齐所以pc值由bits[31:1]决定,bits[0]未定义(所以指令不能byte对齐).2.5ARM异常处理异常通常定义为:处理器需要中止指令正常执行的任何情形并转向相应的处理,包括ARM内核产生复位,取指或存储器访问失败,遇到未定义指令,执行软件中断指令,或者出现外部中断等。大多数异常都对应一个软件的异常处理程序,也就是在异常发生时执行的软件程序。

2.5.1 异常入口ARM处理器的异常分为数据中止、快速中断请求、普通中断请求、预取指中止、软件中断、复位及未定义指令共7种。异常类型处理器模式优先级向量表偏移复

位SVC10x00000000未定义指令UND60x00000004软件中断SWISVC60x00000008预取指中止ABT50x0000000c数据中止ABT20x00000010保留//0x00000014IRQ中断IRQ40x00000018FIQ中断FIQ30x0000001c1.复位具有最高的优先级,是系统启动(或芯片复位)时调用的程序。复位程序对异常处理程序和系统进行初始化(包括配置储存器和Cache)。同时要保证在IRQ和FIQ中断允许之前初始化外部中断源,避免在没有设置好相应的处理程序前产生中断。还要设置好各种处理器模式的堆栈指针。2.引起未定义指令异常:ARM试图执行一条真正的未定义指令;ARM遇到一条协处理器指令,可是系统中的协处理器硬件并不存在;ARM遇到一条协处理器指令,系统中协处理器硬件也存在,可是ARM不是在超级用户模式。解决方法:在处理程序中执行软协处理器仿真;禁止在非超级用户模式下操作;报告错误并退出。3.数据中止异常指示访问了无效的存储器地址,或者当前代码没有正确的数据访问权限。4.预取指中止由于处理器预取的指令地址不存在,或者地址无法访问,当被预取的指令执行时,发生预取指中止异常。5.FIQ中断的优先级比IRQ中断的优先级要高,且内核进入FIQ处理程序时,把FIQ和IRQ都禁止6.软中断(SWI)和未定义指令异常的优先级最低,共享同一优先级,两者不可能同时出现。VectorTableFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00异常处理当异常产生时,ARMcore:拷贝CPSR到SPSR_<mode>设置适当的CPSR位:

改变处理器状态进入ARM状态改变处理器模式进入相应的异常模式设置中断禁止位禁止相应中断(如果需要)保存返回地址到LR_<mode>设置PC位相应的异常向量返回时,异常处理需要:从SPSR_<mode>恢复CPSR从LR_<mode>恢复PCNote:这些操作只能在ARM态执行.向量表指令>32Mbytes<4KbytesLiteralpoolcontainingaddressofUndefHandlerIRQhandlerwithin32MBytesBranch

instructionrangeSWIExceptionhandlerplacedonapplicableaddressboundaryFIQhandlerfollowsvectortable

Undefhandleroutside32MBytes

branchinstructionrange0x00x10000x20000000xFFC0x80x180x300000000xFFFFFFFF0x1C0x4MOVPC,#0x30000000BIRQ_handler0x30008000IRQHandlerSWIHandlerFIQHandlerLDRPC,[PC,#+0xFF0]UndefHandler0x30008000ARMorThumb?Thumb/ARM混合应用程序ARMCodeARMCodeThumb

CodeFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset异常处理中的寄存器使用与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:私有的SP_<mode>

(stackpointer).私有的LR_<mode>(linkregister).私有的SPSR_<mode>

(savedprogramstatusregister).在FIQ异常处理中,另有5个私有的通用寄存器(r8_fiqtor12_fiq).其它的寄存器是所有模式公用的.异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实现任何所需寄存器的初始化要有应用程序的起始代码来完成2.5.2异常产生过程与返回外中断处理FIQvsIRQ中断重新使能的问题软中断未定义指令预取异常数据异常异常返回地址外中断处理ARM有两级外部中断FIQ,IRQ.可是大多数的基于ARM的系统有>2个的中断源!因此需要一个中断控制器(通常是地址映射的)来控制中断是怎样传递给ARM的。在许多系统中,一些中断的优先级比其它中断的优先级高,他们要抢先任何正在处理的低优先级中断。Note:通常中断处理程序总是应该包含清除中断源的代码。地址映射中断控制器nIRQnFIQARMMultiple

Peripheral

interrupt

sourcesARM读控制器寄存器并找到IRQ/FIQ中断源ARM写外设寄存器清相应中断源FIQvsIRQFIQ和IRQ提供了非常基本的优先级级别。在下边两种情况下,FIQs有高于IRQs的优先级:当多个中断产生时,FIQ高于IRQ.处理FIQ时禁止IRQs.IRQs将不会被响应直到FIQ处理完成.FIQs的设计使中断处理尽可能的快.FIQ向量位于中断向量表的最末.为了使中断处理程序可从中断向量处连续执行FIQ模式有5个额外的私有寄存器(r8-r12)中断处理必须保护其使用的非私有寄存器可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。中断重新使能的问题当另外一个中断抢先当前中断时,如果程序员使用下边特殊的步骤来防止系统状态丢失,中断是可以嵌套:保存IRQ状态下的LR(LR_irq)保存IRQ状态下的SPSR(SPSR_IRQ)当中断可重入时,在中断处理程序中使用“BL…”必须特别小心:如果第二个中断产生,BL调用的返回地址(LR_irq)可能被冲掉,子程序将错误的返回–导致无限循环!解决方法是在使用“BL…”之前改变模式来避免LR_irq被冲掉通常使用“System”模式(

这时BL使用LR_usr)在处理程序结束,必须:切换回IRQ模式禁止中断(来避免在恢复SPSR_irq到一个临时的寄存器中后它被冲掉).软中断SWI0x01向量表用户程序(C/ASM)SWI处理程序(ASM)(可选)SWI处理程序(C)用户程序调用SWISWI中断处理程序包含汇编部分和可选用的C部分SWI调用汇编中,SWI调用使用“SWI中断号”实现:

SWI0x24小心在汇编中如果SWI调用时处于Supervisor模式将会冲掉LR_svc.例如:在SWI处理程序中的二级调用解决方法:在SWI调用之前对LR_svc压栈保护

ForExamplecompilesto:SWI调用C中,使用关键词“__swi”来定义一个软中断函数.

ForExamplecompilesto:__swi(0x24)voidmy_swi(void);

voidfoo(void){my_swi();} fooSTMFD sp!,{lr}SWI 0x24LDMFD sp!,{pc}ARM内核不提供直接传递软中断(SWI)号到处理程序的机制:SWI处理程序必须定位SWI指令,并提取SWI指令中的常数域为此,SWI处理程序必须确定SWI调用是在哪一种状态(ARM/Thumb).检查SPSR的T-bitSWI指令在ARM状态下在LR-4位置,Thumb状态下在LR-2位置SWI指令按相应的格式译码:ARM态格式:Thumb态格式:存取SWI号283124270

Cond1111SWInumber231587011011111SWInumber存取SWI参数汇编中,存取调用者设置的寄存器即可.在返回之前,修改寄存器的值,传回参数给调用者.传参数给C,通常采用压栈的方法.将参数压栈给调用的函数传递一个指向这些参数的指针也可以通过将参数值写回到适当的堆栈位置,将参数传回复位(reset)Reset处理程序执行的动作取决于不同的系统.例如它可以:设置异常向量初始化存储器系统(MMU/PU)初始化所有需要的模式的堆栈和寄存器

初始化所有C所需的变量初始化所有I/O设备使能中断改变处理器模式或/和状态调用主应用程序未定义指令下列情况将引起未定义指令异常:ARM试图执行一真正的未定义指令ARM遇到一协处理器指令,可是系统中的协处理器硬件并不存在ARM遇到一协处理器指令,系统中协处理器硬件也存在,可是ARM不是在超级用户模式(privilegedmode)例如:操作协处理器15(cp15)-ARMcache控制器解决方法:在处理程序中执行软协处理器仿真禁止在非超级用户模式下操作报告错误并退出预取异常不论异常是发生在ARM还是Thumb状态下,导致预取异常的指令地址在lr-4处.处理方法取决于存储器管理策略有存储器管理的系统(e.g.demandpagedvirtualmemory)修正问题(e.g.enablecorrectmemorypage)返回并重新执行预取异常的指令(SUBSpc,lr,#4)没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出数据异常导致异常的指令的地址在lr-8处.处理方法取决于存储器管理策略有存储器管理的系统(demanddvirtualmemory)如果使用了MMU,数据异常的地址在MMU的“FaultAddress”寄存器中修正问题(enablecorrectpageofmemory)返回并重新执行数据异常的指令

SUBSpc,lr,#8没有存储器管理的系统通常表示一个致命的错误报告错误(如果可能)然后退出TheAbortModel许多ARM存储器存取指令将更新基址寄存器:LDR r0,[r1,#8]! ;“!”将更新R1如果异常是数据异常,对基址寄存器的影响取决于使用的是哪种ARMcore.“BaseRestoredAbortModel”StrongARM,ARM9andARM10系列支持基址寄存器由ARMcore自动恢复.“BaseUpdatedAbortModel”ARM7TDMI系列支持在异常指令重新执行之前基址寄存器必须由处理程序进行恢复异常返回地址ARM状态:在异常产生的时候内核设置LR_mode=PC-4.处理程序需要调整LR_mode(取决于是哪一个异常发生了),以便返回到正确的地址Thumb状态:处理器根据发生的异常自动修改存在LR_mode中的地址不论异常产生时的状态如何,处理器确保处理程序的ARM返回指令能返回到正确的地址(和正确的状态)从SWIs和未定义指令返回异常是由指令本身引起的,因此内核在计算LR时的PC值并没有被更新. ARMThumbSWI pc-8pc-4 ;Exceptiontakenherexxx pc-4pc-2 ;lr=nextinstructionyyy pcpc因此返回指令为: MOVSPC,LRNote:

表示异常返回后将执行的那条指令从FIQs和IRQs和预取异常返回异常在当前指令执行完成后才被响应.因此内核在计算LR时的PC值已被更新.

ARM

Thumbwww pc-12

pc–6Interruptoccurredduringexecutionxxx

pc-8

pc-4yyypc-4

pc-2

ARMlr=nextinstructionzzzpc

pc

Thumblr=twoinstructionsahead因此返回指令为:SUBSPC,LR,#4Note:表示异常返回后将执行的那条指令从数据异常返回异常发生(和计算LR)在PC被更新之后.需要重新执行导致异常的指令 ARM

Thumb

www

pc-12

pc-6

Dataabortoccurredherexxxpc-8

pc-4yyypc-4

pc-2

ARMlr=twoinstructionsaheadzzzpc

pcaaapc+4

pc+2Thumblr=fourinstructionsahead因此返回指令为:

SUBSpc,lr,#8Note:

表示异常返回后将执行的那条指令从SWI和Undef异常返回 MOVS

pc,lr从FIQ,IRQ和预取异常(PrefectAbort)返回

SUBS

pc,lr,#4

从数据异常(DataAbort)返回

SUBS

pc,lr,#8

如果LR之前被压栈的话使用LDM“^” LDMFDsp!,{pc}^异常返回:使用一数据处理指令:相应的指令取决于什么样的异常在特权模式不仅仅更新PC,而且拷贝SPSR到CPSR设置CPSR,“S”bitPC做为目的寄存器异常返回指令2.6存储方式与存储器映射机制ARM处理器地址空间大小为4G字节,这些字节的单元地址是一个无符号的32位数值,其取值范围为0~232-1。各存储单元地址作为32位无符号数,可以进行常规的整数运算。当程序正常执行时,每执行一条ARM指令,当前指令计数器加4个字节;每执行一条Thumb指令,当前指令计数器加2个字节。2.6.1 数据存储格式小端存储格式(Little-Endian)大端存储格式(Big-Endian)TheARM可以用little/bigendian格式存取数据.r0=0x11223344STRr0,[r1]LDRBr2,[r1]r1=0x100Memory32100123ByteLane312423161587011223344312423161587011223344312423161587011223344312423161587000000044312423161587000000011LittleendianBigendianR2=0x44R2=0x11Formoreinformation,see:“ApplicationNote:BigandLittleEndianByteAddressing”字节顺序2.6.2 非对齐存储器地址访问问题分析1.非对齐的指令预取操作如果是在ARM状态下将一个非对齐地址写入PC,则数据在写入PC时数据的第0位和第1位被忽略,最终PC的bit[1:0]为0;如果是在Thumb状态下将一个非对齐地址写入PC,则数据在写入PC时数据的第0位被忽略,最终PC的bit[0]为0。2.非对齐地址内存的访问操作

对于LOAD/STORE操作,系统定义了下面3种可能的结果:

*执行结果不可预知

*忽略字单元地址低两位的值,即访问地址为字单元;忽略半字单元最低位的值,即访问地址为半字单元。这种忽略是由存储系统自动实现的。2.7ARM流水线技术分析ARM7流水线技术与三级流水线运行情况分析ARM9流水线技术与五级流水线互锁分析ARM10E系列概述ARM7流水线技术为增加处理器指令流的速度,ARM7系列使用3级流水线.允许多个操作同时处理,比逐条指令执行要快。PC指向正被取指的指令,而非正在执行的指令FetchDecodeExecute从存储器中读取指令解码指令寄存器读(从寄存器Bank)移位及ALU操作寄存器写(到寄存器Bank)PC PCPC-4 PC-2PC-8 PC-4ARM Thumb最佳流水线该例中用6个机器周期执行了6条指令所有的操作都在寄存器中(单周期执行)指令周期数(CPI)=1机器周期

操作周期 1 2 3 4 56

ADD

SUB

MOV

AND

ORR

EOR

CMP

RSBFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteDecodeExecuteFetchDecodeFetchFetch

LDR流水线举例该例中,用6机器周期执行了4条指令指令周期数(CPI)=1.5机器周期周期

操作 1 2 3 4 5 6

ADD

SUB

LDR

MOV

AND

ORRFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteDataWritebackFetchDecodeExecuteFetchDecodeFetch分支流水线举例流水线被阻断注意:内核运行在ARM状态周期

12345

0x8000BL0x8004X0x8008XX0x8FECADD0x8FF0SUB0x8FF4MOV地址

操作FetchDecodeExecuteFetchDecodeExecuteFetchDecodeFetchFetchDecodeExecuteLinkretAdjustFetchDecodeFetch中断流水线举例周期

12345678IRQ

IRQ中断的反应时间最小=7机器周期地址

操作FDELinkretAdjustFFDecodeIRQLinkretExecuteIRQAdjustFDEFDFFDEFDFF0x8000ADD0x8008MOV0x0018B(to0xAF00)0x8004SUB0x001CXX0x0020XXX0xAF00STMFD0xAF04MOV0xAF08LDR0x800CXDARM9TDMI流水线的变化InstructionFetch

Shift+ALUMemoryAccessRegWriteRegReadRegDecodeFETCHDECODEEXECUTEMEMORYWRITEARM9TDMIARMorThumb

InstDecodeRegSelectRegReadShiftALURegWriteThumb®ARM

decompressARMdecodeInstructionFetchFETCHDECODEEXECUTEARM7TDMI周期操作ADD R1,R1,R2SUB R3,R4,R1ORR R8,R3,R4AND R6,R3,R1EOR R3,R1,R212345678LDR R4,[R7]9FDEFDEWFDEWFDEWFDWEFDEWF–取指(Fetch)D

–解码(Decode) E–执行(Execute)I–互锁(Interlock)M–存储器(Memory)W–写回(Writeback)ILDR互锁本例中,用了7个机器周期执行6条指令,CPI=1.2机器周期。LDR指令之后立即跟一条数据操作指令,由于使用了相同的寄存器,将会导致互锁。WIM周期操作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论