ARM与嵌入式技术培训课件第2章.ppt
2.10 异常简介 计算机通常用异常来处理在执行程序时发生的意外事件,如中断,存储器故障等,它需要停止程序的执行流程。当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行异常处理,异常中断处理完成后,程序返回。在ARM体系结构中,异常中断用来处理软件中断,未定义指令陷阱及系统复位功能和外部事件,这些“不正常”事件都被划归“异常”。2.10 异常简介 ARM异常按引起异常事件的不同可分为3类:(1)指令执行引起的直接异常 软件中断,未定义指令和预取指中止属于这一类。(2)指令执行引起的间接异常 数据中止属于这一类。(3)外部产生的与指令流无关的异常 复位,IRQ和FIQ属于这一类。2.10 异常简介 例如响应一个来自外设的中断。在处理异常之前,ARM7TDMI内核保存当前的处理器状态,这样当处理程序结束时可以恢复执行原来的程序。异常入口/出口汇总异常或入口返回指令之前的状态备注ARM R14_xThumb R14_xBLMOV PC,R14PC+4PC+2 此处PC为BL,SWI,为定义的指令取指或预取指中止指令的地址SWIMOVS PC,R14_svcPC+4PC+2未定义的指令MOVS PC,R14_undPC+4PC+2预取指中止SUBS PC,R14_abt,#4PC+4PC+4快中断SUBS PC,R14_fiq,#4PC+4PC+4此处PC为由于FIQ或IRQ占先而没有被执行的指令的地址中断SUBS PC,R14_irq,#4PC+4PC+4数据中止SUBS PC,R14_abt,#8PC+8PC+8此处PC为产生数据中止的装载或保存指令的地址。复位无复位时保存在R14_svc中的值不可预知。注意:“MOVS PC,R14_svc”是指在管理模式执行MOVS PC,R14指令。“MOVS PC,R14_und”、“SUBS PC,R14_abt,#4”等指令也是类似的。2.10 异常异常的入口和出口处理 如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。SUB LR,LR,#4;计算返回地址STMFD SP!,R0-R3,LR;保存使用到的寄存器.LDMFD SP!,R0-R3,PC;中断返回中断处理代码的开始部分和退出部分 如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。中断处理代码的开始部分和退出部分2.10 异常异常的入口和出口处理SUB LR,LR,#4;计算返回地址STMFD SP!,R0-R3,LR;保存使用到的寄存器.LDMFD SP!,R0-R3,PC;中断返回注意:中断返回指令的寄存器列表(其中必须包括PC)后的“”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。这里使用的堆栈指针SP(R13)是属于异常模式的寄存器,每个异常模式有自己的堆栈指针。这个堆栈指针应必须在系统启动时初始化。2.10 异常进入异常在异常发生后,ARM7TDMI内核会作以下工作:1.在适当的LR中保存下一条指令的地址,当异常入口来自:ARM状态,那么ARM7TDMI将当前指令地址加4或加8复制(取决于异常的类型)到LR中;为Thumb状态,那么ARM7TDMI将当前指令地址加4或加8(取决于异常的类型)复制到LR中;异常处理器程序不必确定状态。2.10 异常进入异常在异常发生后,ARM7TDMI内核会作以下工作:2.将CPSR复制到适当的SPSR中;3.将CPSR模式位强制设置为与异常类型相对应的值;4.强制PC从相关的异常向量处取指。ARM7TDMI内核在中断异常时置位中断禁止标志,这样可以防止不受控制的异常嵌套。注:异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。2.10 异常进入异常当异常结束时,异常处理程序必须:1.将LR中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同;2.将SPSR的值复制回CPSR;3.清零在入口置位的中断禁止标志。注:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。2.10 异常退出异常程序AIRQ服务程序系统模式IRQ模式程序寄存器组图示进入异常过程1.程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断;2.用户程序运行时发生IRQ中断,硬件完成以下动作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0.?MODTFI.N Z C V置位I位(禁止IRQ中断)清零T位(进入ARM状态)设置MOD位,切换处理器模式至IRQ模式将下一条指令的地址存入IRQ模式的LR寄存器将CPSR寄存器内容存入IRQ模式的SPSR寄存器将跳转地址存入PC,实现跳转IRQ0?1.?BackAddrJumpAddrJumpSYS1?0.?“?”表示对该位不关心在异常处理结束后,异常处理程序完成以下动作:程序AIRQ服务程序系统模式IRQ模式程序寄存器组图示退出异常过程LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0.?MODTFI.N Z C V将SPSR寄存器的值复制回CPSR寄存器;将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。IRQ0?1.?BackAddrJumpAddrreturnSYS1?0.?SYS1?0.?BackAddr-4Jump“?”表示对该位不关心 快速中断请求(FIQ)适用于对一个突发事件的快速响应,这得益于在ARM状态中,快中断模式有8个专用的寄存器可用来满足寄存器保护的需要(这可以加速上下文切换的速度)。不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:SUBS PC,R14_fiq,#4 在一个特权模式中,可以通过置位CPSR中的F位来禁止FIQ异常。2.10 异常快速中断请求(FIQ)中断请求(IRQ)异常是一个由nIRQ输入端的低电平所产生的正常中断(在具体的芯片中,nIRQ由片内外设拉低,nIRQ是内核的一个信号,对用户不可见)。IRQ的优先级低于FIQ。对于FIQ序列它是被屏蔽的。任何时候在一个特权模式下,都可通过置位CPSR中的I位来禁止IRQ。不管异常入口是来自ARM状态还是Thumb状态,IRQ处理程序都会通过执行下面的指令从中断返回:SUBS PC,R14_irq,#42.10 异常中断请求(IRQ)中止表示当前对存储器的访问不能被完成。这是通过外部ABORT输入指示的(在具体的芯片中,ABORT 信号由片内存储器管理不见控制,ABORT 是内核的一个信号,对用户不可见)。处理器在存储器访问周期结束时检测中止异常。中止包含两种类型:预取中止 发生在指令预取过程中数据中止 发生在对数据访问时2.10 异常中止 当发生预取中止时,ARM7TDMI内核将预取的指令标记为无效,但在指令到达流水线的执行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被执行,中止将不会发生。在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令恢复PC和CPSR并重试被中止的指令:SUBS PC,R14_abt,#42.10 异常中止预取中止 当发生数据中止后,根据产生数据中止的指令类型作出不同的处理:2.10 异常中止数据中止(1)数据转移指令(LDR、STR)回写到被修改的基址寄存器。中止处理程序必须注意这一点;(2)交换指令(SWP)中止好像没有被执行过一样(中止必须发生在SWP指令进行读访问时);(3)块数据转移指令(LDM,STM)完成。当回写被设置时,基址寄存器被更新。在指示出现中止后,ARM7TDMI内核防止所有寄存器被覆盖。这意味着ARM7TDMI内核总是会保护被中止的LDM指令中的R15(总是最后一个被转移的寄存器)。2.10 异常中止数据中止 当发生数据中止后,根据产生数据中止的指令类型作出不同的处理:在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的返回指令:SUBS PC,R14_abt,#8即在中止模式执行“SUBS PC,R14,#8”指令,这个动作恢复了PC和CPSR并重试被中止的指令。2.10 异常中止数据中止 使用软件中断(SWI)指令可以进入管理模式,通常用于请求一个特定的管理函数。SWI处理程序通过执行下面的指令返回:MOVS PC,R14_svc 即在管理模式执行“MOVS PC,R14”指令。这个动作恢复了PC和CPSR并返回到SWI之后的指令。SWI处理程序读取操作码以提取SWI函数编号。2.10 异常软件中断指令(SWI)当ARM7TDMI处理器遇到一条自己和系统内任何协处理器都无法处理的指令时,ARM7TDMI内核执行未定义指令陷阱。软件可使用这一机制通过模拟未定义的协处理器指令来扩展ARM指令集。注:ARM7TDMI处理器完全遵循ARM结构v4T,可以捕获所有分类未被定义的指令位格式。2.10 异常未定义的指令 在模拟处理了失败的指令后,陷阱程序执行下面的指令:MOVS PC,R14_svc 即在未定义模式执行“MOVS PC,R14_svc”指令。这个动作恢复了PC和CPSR并返回到未定义指令之后的指令。2.10 异常未定义的指令异常向量地址异常类型进入时的模式进入时I的状态进入时F的状态0 x0000 0000复位管理禁止禁止0 x0000 0004未定义指令未定义F0 x0000 0008软件中断管理禁止F0 x0000 000C中止(预取)中止F0 x0000 0010中止(数据)中止F0 x0000 0014保留保留0 x0000 0018IRQ中断禁止F0 x0000 001CFIQ快中断禁止禁止注:表中的I和F表示不对该位有影响,保留原来的指。当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序:2.10 异常异常优先级异常类型优先级复位1(最高优先级)数据中止2FIQ3IRQ4预取中止5未定义指令6SWI7(最低优先级)优先级降低 复位是优先级最高的异常中断,这是因为复位从确定的状态启动微处理器,使得所有其他未解决的异常都没有关系了。注意:有些异常不能一起发生:未定义的指令和SWI异常互斥。因为同一条指令不能既是未定义的,又能产生有效的软件中断;当FIQ使能,并且FIQ和数据中止异常同时发生时,ARM7TDMI内核首先进入数据中止处理程序,然后立即跳转到FIQ向量。在FIQ处理结束后返回到数据中止处理程序。数据中止的优先级必须高于FIQ以确保数据转移错误不会被漏过。2.10 异常异常优先级2.11 中断延迟最大中断延迟Tsyncmax,请 求 通 过 同 步 器 的 最 长 时 间。Tsyncmax为2个处理器周期(由内核决定);当FIQ使能时,最坏情况是正在执行一条装载所有寄存器的指令“LDM”(它耗时最长),同时发生了FIQ和数据中止异常,在响应FIQ中断之前要先把正在执行的指令完成,然后先进入数据中止异常,再、马上跳转到FIQ异常入口,所以延迟时间包含:2.11 中断延迟最大中断延迟Tldm,最长的指令执行需要的时间(最长的指令是装载包括PC在内所有寄存器的LDM指令)。Tldm在零等待状态系统中的执行时间为20个周期。注意,是在零等待状态系统中。一般的基于ARM7核的芯片的存储器系统比内核速度慢,造成其不是零等待的;Texc,数据中止入口的时间。Texc为3个周期(由内核决定);Tfiq,FIQ入口的时间。Tfiq为2个周期(由内核决定)。2.11 中断延迟最大中断延迟FIQ总的延迟时间=Tsyncmax+Tldm+Texc+Tfiq=27个周期 在40MHz处理器时钟时,最大延迟时间略少于0.7us。在此时间结束后,ARM7TDMI执行位于0 x1C处的指令。最大的IRQ延迟时间与之相似,但必须考虑到这样一种情况,当更高优先级的FIQ和IRQ同时申请时,IRQ要延迟到FIQ处理程序允许IRQ中断时才处理(可能需要对中断控制器进行相应的操作)。IRQ延迟时间也要相应增加。2.11 中断延迟最小中断延迟 FIQ或IRQ的最小中断延迟是请求通过同步器的时间Tsyncmin加上Tfiq(共4个处理器周期)。2.12 复位复位 当nRESET信号被拉低时(一般外部复位引脚电平的变化和芯片的其它复位源会改变这个内核信号),ARM7TDMI处理器放弃正在执行的指令。在复位后,除PC和CPSR之外的所有寄存器的值都不确定。2.12 复位复位 当nRESET信号再次变为高电平时,ARM处理器执行下列操作:1.强制M4:0变为b10011(管理模式);2.置位CPSR中的I和F位;3.清零CPSR中的T位;4.强制PC从地址0 x00开始对下一条指令进行取指;5.返回到ARM状态并恢复执行。2.13 存储器及存储器映射I/O简介 在现代SoC设计中,为了实现高性能,微处理器核必须连接一个容量大,速度高的存储器系统。如果存储器容量太小,就不能存储足够大的程序来使处理器全力处理;如果速度太慢,就不能为处理器快速得提供指令。但不能设计一个足够大又足够快的单一存储器,一般的解决方法是构建一个复合的存储器系统,这就是多级存储器。多级存储器包括一个容量小但速度快的从存储器Cache,能自动地保存处理器经常用到的指令和数据的拷贝,以及一个容量大但速度慢的主存储器。这2级存储器原理可扩展为多级存储器层次,如通常所谓的Cache,主存和硬盘构成3级存储层次。2.13 存储器及存储器映射I/O简介 ARM7TDMI处理器采用冯诺曼(Von Neumann)结构,指令和数据共用一条32位数据总线。只有装载、保存和交换指令可访问存储器中的数据。ARM7的规范仅定义了处理器核与存储系统之间的信号及时序(局部总线),而现实的芯片一般在外部总线与处理器核的局部总线之间有一个存储器管理部件将局部总线的信号和时序转换为现实的外部总线信号和时序。因此,外部总线的信号和时序与具体的芯片相关,不是ARM7的标准。具体到某个芯片的外部存储系统的设计需要参考其芯片的数据手册或使用手册等资料。ARM7内核存储器控制器存储器2.13 存储器及存储器映射I/O简介ARM7定义了局部总线的接口时序各芯片厂商制定了自己的接口时序ARM7局部总线一般在两者之间加入存储器控制器2.13 存储器及存储器映射I/O简介 ARM7TDMI处理器将存储器看作是一个从0开始的线性递增的字节集合:字节0到3保存第1个存储的字字节4到7保存第2个存储的字字节8到11保存第3个存储的字ARM7TDMI处理器可以将存储器中的字以下列格式存储大端格式小端格式2.13 存储器及存储器映射I/O地址空间 ARM结构使用单个平面的232个8位字节地址空间。字节地址按照无符号数排列,从0到2321。地址空间可以看作是包含230个32位字,或231个16位半字。如果地址向上或向下溢出地址空间,通常会发生翻转。注意:如果在取指操作时地址发生溢出,只要没有执行预取的无效指令,就不会导致异常。2.13 存储器及存储器映射I/O地址空间跳转目标的计算方法:(当前指令的地址)+8+偏移量下一条指令位置的计算方法:(当前指令的地址)+4 2.13 存储器及存储器映射I/O存储器格式地址空间的规则:位于地址A的字包含的字节位于地址A,A+1,A+2和A+3;位于地址A的半字包含的字节位于地址A和A+1;位于地址A+2的半字包含的字节位于地址A+2和A+3;位于地址A的字包含的半字位于地址A和A+2;字节字节字节字节地址AA+1A+2A+3半字半字字存储器系统有两种映射机制:小端存储器系统:在小端格式中,高位数字存放在高位字节中。因此存储器系统字节0连接到数据线70。大端存储器系统:在大端格式中,高位数字存放在低位字节中。因此存储器系统字节0连接到数据线3124。0 x12345678字数据的大小端存储方式2.13 存储器及存储器映射I/O存储器格式0 x12高位地址低位地址0 x340 x560 x78大端模式0 x78高位地址低位地址0 x560 x340 x12小端模式 一个基于ARM内核的芯片可以只支持大端模式或小端模式,也可以两者都支持。在ARM指令集中不包含任何直接选择大小端的指令,但是一个同时支持大小端模式的ARM芯片可以通过硬件配置(一般使用芯片的引脚来配置)来匹配存储器系统所使用的规则。2.13 存储器及存储器映射I/O存储器格式注意:如果一个基于ARM芯片将存储器系统配置为其中一种存储器格式(如小端格式),而实际连接的存储器系统配置为相反的格式(如大端格式),那么只有以字为单位的数据存取(指令取指、数据装载和数据保存)才正确,否则将出现不可预期的结果。ARM结构通常期望所有的存储器访问都合理的对齐。具体来说就是字访问的地址通常是字对齐的,而半字访问使用的地址是半字对齐的。不按这种方式对齐的存储器访问称为非对齐的存储器访问。将 一 个 非 字(半 字)对 齐 的 地 址 写 入ARM(Thumb)状态的R15寄存器,将引起非对齐的指令取指。在一个非字(半字)对齐的地址读写一个字(半字),将引起非对齐的数据访问:2.13 存储器及存储器映射I/O未对齐的存储器访问 许多ARM实现在前一条指令的执行尚未完成时将指令从存储器中取出。这个动作称为指令的预取。指令的预取并不是实际执行指令。被预取的指令可能得不到运行,可能的原因是:发生异常(当前指令执行完毕,所有预取的指令都被丢弃,指令的执行从异常向量开始);发生跳转(预取的在分支指令后的指令将被丢弃);2.13 存储器及存储器映射I/O指令的预取和自修改代码 当指令读取PC时,得到的指令地址比正在执行指令的地址落后两条指令:对于ARM指令,得到的地址是它自身地址+8;对于Thumb指令,得到的地址是它自身地址+4;虽然生产厂商可以选择预取指令的数目,但是仍然可以保证读取PC所得到地址比它自身地址落后两条指令。2.13 存储器及存储器映射I/O指令的预取和自修改代码 在预取指令之前要进行转移预测,例如在执行一条分支指令,此时要判断是预取分支指令之后的指令还是转移目标地址的指令。2.13 存储器及存储器映射I/O指令的预取和自修改代码?内核流水性执行译码预取 LDR R0,AddInstr STR R0,NextInstrNextInstr SUB R1,R1,#1 .AddInstr ADD R1,R1,#1(1)(2)(4)(3)在存储器中的指令可能在它被预取之后,被执行之前发生改变。如果发生这种情况,对存储器中的指令进行修改一般不能妨碍已取指的指令的执行。2.13 存储器及存储器映射I/O预取可能存在的问题LDR R0,AddInstrSTR R0,NextInstrLDR R0,AddInstrSTR R0,NextInstrLDR R0,AddInstrSUB R1,R1,#11.从地址(1)预取指;2.从地址(2)预取指,“LDR”指令进入译码阶段;3.从地址(3)预取指,“STR”指令进入译码阶段,同时“LDR”指令进入执行阶段,结果是将地址(4)的指令装入R0;4.继续预取指,同时“STR”指令进入执行阶段,结果是将“ADD”指令存入地址(3),“SUB”指令被覆盖;虽然“SUB”指令在存储器中被覆盖,但是它仍存在于流水线上,并进入执行阶段;ADD R1,R1,#1(3)SUB R1,R1,#1STR R0,NextInstr?SUB R1,R1,#1?LDR R0,AddInstr STR R0,NextInstrNextInstr SUB R1,R1,#1 .AddInstr ADD R1,R1,#1(1)(2)(4)(3)如果在“SUB”指令预取之后,执行之前,发生中断,那么该指令将被丢弃,不会执行,而执行ADD指令。如果ARM处理器或存储器系统允许保持预取指令的备份并使用这些备份而不是重新预取,那么以后执行这段代码,仍将执行“SUB”指令。2.13 存储器及存储器映射I/O预取可能存在的问题提示:因为自修改代码有许多特需要考虑,建议尽量避免使用。在许多系统中,几乎不可能完全避免自修改代码的使用。例如,任何一个允许将程序装入存储器然后执行的系统都使用自修改代码。因此每个ARM芯片都定义了一系列的操作,使自修改代码序列可以可靠地执行。这一串代码称为指令存储器屏障(IMB),它通常同时取决于具体的ARM芯片的和具体存储器芯片。2.13 存储器及存储器映射I/O指令存储器屏障(IMB)2.13 存储器及存储器映射I/O指令存储器屏障(IMB)IMB序列必须在新的指令已经保存到存储器之后而尚未执行时执行例如,在程序被装载之后并且在转移到它的入口之前任何不以这种方式使用IMB的自修改代码序列都可能会执行不确定的动作根据IMB所执行的确定的操作顺序取决于ARM和存储器系统的实现(可以理解为具体的芯片)建议在软件设计时使IMB序列作为一个调用程序来替换与系统相关的模块,而不是直接插入到需要的地方这样易于移植到其他ARM处理器和存储系统2.13 存储器及存储器映射I/O指令存储器屏障(IMB)为了允许用户模式程序使用IMB序列,推荐将其作为一个操作系统调用程序,由SWI指令调用。在SWI指令使用24位立即数的系统中指定所要求的系统服务,推荐通过下面的指令来请求IMB序列:SWI 0 xF00000 这是一个无参调用,不返回结果,应当使用与带原型的C函数调用相同的调用约定:void IMB(void);基于ARM内核的芯片具有许多的外设,这些外设访问的标准方法是使用存储器映射的I/O,为外设的每个寄存器都分配一个地址。通常,从这些地址装载数据用于读入,向这些地址保存数据用于输出。有些地址的装载和保存用于外设的控制功能,而不是输入或输出功能。存储器映射的I/O位置的动作通常不同于正常的存储器位置的动作。例如,正常存储器位置的两次连续装载每次都会返回相同的值,除非中间插入了保存的操作。对于存储器映射的I/O位置,第二次装载返回的值可以不同于第一次返回的值。因为第一次装载的副作用(例如从缓冲区移走已装载的值)或是因为插入另一个存储器映射I/O位置的装载和保存的副作用。2.13 存储器及存储器映射I/O存储器映射的I/O 这些区别主要影响高速缓存的使用和存储器系统的写缓冲区。一般来说,存储器映射的I/O位置通常标识为无高速缓存和无缓冲区,以避免对它们进行访问的次数,类型,顺序或时序发生改变。2.13 存储器及存储器映射I/O存储器映射的I/O2.13 存储器及存储器映射I/O存储器映射的I/O(1)从存储器映射的I/O取指(2)不同ARM的实现在存储器指令取指时会有相当大的区别建议存储器映射的I/O位置只用于数据的装载和保存,不用于指令取指任何依赖于从存储器映射I/O位置取指的系统设计都可能难以移植到将来的ARM实现。2.13 存储器及存储器映射I/O存储器映射的I/O(2)对存储器映射I/O的数据访问(3)一个指令序列在执行时,会在不同的点访问数据存储器,产生装载和保存访问的时序如果这些装载和保存访问的是正常的存储器位置,那么它们在访问相同的存储器位置时,只是执行交互操作结果,对不同存储器位置的保存和装载可以按照不同于指令的顺序执行,但不会改变最终的结果这种改变存储器访问顺序的只有可被存储器系统用来提高性能(例如通过使用高速缓存和写缓冲区)。2.14 寻址方式简介寻址方式分类 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。1.立即寻址;2.寄存器寻址;3.寄存器间接寻址;4.基址寻址;5.相对寻址;6.寄存器移位寻址;7.多寄存器寻址;8.堆栈寻址;9.块拷贝寻址。ARM7TDMI处理器有两个指令集,每种指令集都有自己的优缺点:32位ARM指令集:对ARM核的特性提供最大的支持,具有高效、快速的特点;16位Thumb指令集:它是ARM指令的子集,具有更高的代码密度,非常适合存储器带宽和空间都受限制的嵌入式应用场合。2.15 ARM7指令集简介简介 ARM指令集可分为5大类指令,所有指令都可以条件执行,其中一些指令还可以根据执行结果更新CPSR寄存器的相关标志位(N、Z、C和V):分支指令;数据处理指令;加载和存储指令;协处理器指令;杂项指令。2.15 ARM7指令集简介ARM指令集2.15 ARM7指令集简介ARM指令集分支指令指令助记符 功能描述B 分支指令 BX 带状态切换的分支指令 BL 带连接的分支指令 2.15 ARM7指令集简介分支指令 转移和连接(BL)选项在跳转后将指令地址保存在R14(LR)当中这样通过将LR复制到PC可实现子程序的返回 另外有的分支指令可在指令集之间进行切换,此时,分支指令执行完成后处理器继续执行Thumb指令集的指令这样就允许ARM代码调用Thumb子程序,而ARM子程序也可返回到Thumb调用程序Thumb指令集中相似的指令可实现对应的ThumbARM切换2.15 ARM7指令集简介数据处理指令 数据处理指令在通用寄存器上执行计算ARM7TDMI的数据处理指令分为种类型:算术逻辑指令、比较指令和乘法指令(1)算术逻辑指令 算术/逻辑指令共有12条,它们使用相同的指令格式,最多使用两个源操作数来执行算术或逻辑操作,并将结果写入目标寄存器;也可选择根据结果更新条件代码标志。两个源操作数为:其中一个一定是寄存器,另一个有两种基本形式立即数或是寄存器值,可选择移位。2.15 ARM7指令集简介数据处理指令(2)比较指令 比较指令有4条,它们使用与算术/逻辑指令相同的指令格式。比较指令根据两个源操作数执行算术或逻辑操作,但不将结果写入寄存器。它们总是根据结果更新条件代码标志。(3)乘法指令 乘法指令分成两类。这两类指令都将32位寄存器值相乘并保存结果。32位结果正常,在一个寄存器中保存32位结果。64位结果长,在两个独立的寄存器中保存64位结果。2.15 ARM7指令集简介 加载存储指令 加载保存指令包括:加载存储寄存器,加载存储多个寄存器和交换寄存器和存储器内容类别 指令助记符 功能描述 单寄存器加载 LDR 存储器向寄存器加载字数据 多寄存器加载 LDM 存储器向多个寄存器加载字数据 单寄存器存储 STR 寄存器向存储器存储字数据 多寄存器存储 STM 多个寄存器向存储器存储字数据 寄存器交换 SWP 寄存器与存储器交换字数据 2.15 ARM7指令集简介ARM指令集协处理器指令 协处理器指令有种类型:数据处理指令:启动一个协处理器专用的内部操作数据转移指令:将数据在协处理器和存储器之间进行转移。寄存器转移指令:允许协处理器值转移到ARM寄存器或将ARM寄存器值转移到协处理器2.15 ARM7指令集简介ARM指令集协处理指令指令助记符 功能描述 CDP 协处理器数据操作指令 LDC 协处理器数据加载指令 MCR ARM处理器寄存器到协处理器寄存器的数据传送指令 MRC 协处理器寄存器到ARM处理器寄存器的数据传送指令 STC 协处理器数据存储指令 2.15 ARM7指令集简介协处理器指令CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。LDC指令用于把源寄存器所指向的存储器中的字数据传送到目的寄存器中。若协处理器不能成功完成传送操作,则产生未定义指令异常。STC指令与LDC指令对应,用于把源寄存器Rs中的字数据传送到目的寄存器Rd所指向的存储器。若协处理器不能成功完成传送操作,则产生未定义指令异常。2.15 ARM7指令集简介ARM指令集(5)杂项指令 杂项指令包括状态寄存器转移指令和异常产生指令指令助记符 功能描述 SWI 软件中断指令 Thumb指令集可分为4大类指令:分支指令;数据处理指令;寄存器加载和存储指令;异常产生指令。2.15 ARM7指令集简介Thumb指令集 ARM7TDMI处理器指令集可以通过协处理器来实现特殊的附加指令。这些协处理器是与ARM7TDMI内核相结合的单独的处理单元。一个典型的协处理器包括:指令流水线;指令译码逻辑;寄存器分组;带独立数据通路的特殊处理逻辑。2.16 协处理器接口简介ARM内核与协处理器的关系2.16 协处理器接口简介ARM内核协处理器A协处理器B握手信号数据地址总线2.16 协处理器接口指令的执行由ARM7TDMI内核与协处理器共同实现 ARM7TDMI内核用于:求出条件代码的值以确定指令是否必须由协处理器执行,然后使用CPnI(内核与协处理器握手的信号)通知系统中的所有协处理器 产生指令所要求的地址来填充流水线 如果出现协处理器不接受的指令,则执行未定义指令陷阱协处理器用于:对指令进行译码以确定是否接受 通过CPA和CPB(内核与协处理器握手的信号)指示它是否接受这一指令 从自身的寄存器组当中取出任何需要的值 执行指令所需要的操作 一个系统最多可连接16个协处理器,每个协处理器都通过唯一的ID号识别。ARM7TDMI处理器包含两个协处理器,它们不能再用在外部协处理器:CP14 通信通道协处理器;CP15 为cache和MMU功能提供的系统控制协处理器。2.16 协处理器接口可用的协处理器2.16 协处理器接口可用的协处理器 不能将外部协处理器的编号分配为14和15.ARM还保留了其他的协处理器编号,见右表.协处理器编号 分配 15 系统控制 14 调试控制器 13:8 保留 7:4可供芯片设计者使用 3:0 保留2.16 协处理器接口关于未定义的指令 ARM7TDMI处理器执行完全的ARM结构v4T未定义指令的处理.这意味着ARM体系结构参考手册中定义为UNDEFINED的任何指令都会使ARM7TDMI处理器执行未定义指令陷阱.任何一个不被协处理器接受的指令也会使ARM7TDMI处理器执行未定义指令陷阱.2.17 调试接口简介一个调试系统通常具有3个部分 (1)调试主机 是一台运行调试软件(例如ARM的Windows版调试器AXD和EMBEST的集成开发环境IDE)的计算机.调试主机使您可以使用设置断点或检查存储器内容这些高级命令.(2)协议转换器 是调试主机发出的高级命令与ARM7TDMI处理器JTAG接口的低级命令之间的接口.典型地,它通过一个接口(例如增强型并口)与主机相连.2.17 调试接口简介(3)调试目标 ARM7TDMI处理器具有便于进行底层调试的硬件扩展.这些扩展可以:暂停程序的执行;检查和修改内核的内部状态;检查存储器系统的状态;执行中止异常,允许实时监控内核;恢复程序执行;调试主机和协议转换器与系统有关。ARM7TDMI处理器的高级调试特性使应用程序、操作系统和硬件的开发变得更加容易。2.17 调试接口简介典型调试系统调试主机:一台运行调试软件的计算机。协议转换器:将调试主机发出的高级命令转换到处理器JTAG接口的低级命令。调试目标:具体的硬件目标板。2.17 调试接口简介 EmbeddedICE-RT ARM7TDM处理器EmbeddedICE-RT模块为ARM7TDMI内核提供集成的片内调试支持.EmbeddedICE-RT通过ARM7TDMI处理器TAP控制器串行编程.下图为内核.EmbeddedICE-RT模块2.17 调试接口简介EmbeddedICE-RT与TAP控制器之间的关系,其中只显示了与EmbeddedICE-RT有关的信号.EmbeddedICE-RT逻辑包含下面这些部分.两个实时观察点单元.可以编程这两个观察点或其中一个使内核暂停指定指令的执行.当编程到EmbeddedICE-RT的值与地址总线、数据总线和不同的控制信号上出现的值相匹配时,指令的执行会被暂停.可以屏蔽其中任何一位使它的值不影响比较.每个观察点单元都可配置为观察点(监视数据的访问)或断点(监视指令取指).中止状态寄存器.该寄存器用于识别产生异常中止的原因.调试通信通道DCC.DCC在目标系统与主机调试程序之间传递信息2.17 调试接口简介扫描链和JTAG接口在ARM7TDMI处理器中的有两个扫描链用于实现调试和EmbeddedICE-RT编程.JTAG类型的测试访问端口(TAP)控制器控制扫描链.2.17 调试接口简介基于JTAG的ARM系统调试 嵌入式系统应用软件的开发属于跨平台开发,因此需要一个交叉开发环境。交叉开发是指在一台通用计算机上进行软件的编辑,编译,然后下载到嵌入式设备中运行调试的开发方式。交叉开发环境一般由运行于宿主机上的交叉开发软件,宿主机到目标机的调试通道组成。为了方便调试开发,交叉开发软件一般为一个整合编辑,编译汇编链接,调试,工程管理及函数库等功能模块的集成开发环境IDE。组成嵌入式交叉开发环境的宿主机到目标机的调试通道一般有3种:在线调试或在仿真,在线仿真器,ROM监视器。2.17 调试接口简介基于JTAG的ARM系统调试 基于JTAG的ICD就是属于在线调试,它是目前ARM开发中采用最多的一种方式。大多数ARM设计采用了片上JATG接口,并将它作为其测试和调试方法的重要组成。JATG仿真器,也称为JATG的在线调试器ICD(In-Circuit Debugger),是通过ARM处理器特有的JATG边界扫描口与目标机通信进行调试,并可通过并口或串口,USB口等与宿主机PC通信。2.17 调试接口简介基于JTAG的ARM系统调试 JTAG仿真器连接比较方便,实现价格也比较便宜,是通过现有的JTAG边界扫描口与ARM CPU核通信,实现了完全非插入式调试,不使用片上资源,不需要目标存储器,不占用目标系统的任何端口。由于JTAG调试的目标程序是在目标板上执行,仿真更加接近于目标硬件。基于JTAG的ARM的内核调试通道,具有典型的ICE 功能,包含有Embedded ICE模块的基于ARM的SoC芯片通过JTAG调试端口与主计算机连接。通过配置,支持正常的断点,观察点以及处理器和系统状态访问,完成调试。为了对代码运行过程进行实时跟踪,ARM提供了跟踪宏单元ETM,通过嵌入式实时跟踪系统,实时观察其操作过程,对应用程序的调试将更加全面,客观和真实。外 部 嵌 入 式 跟 踪 宏 单 元(ETM)连 接 到ARM7TDMI处理器,这样就能够实现对正在执行的处理器进行代码的实时跟踪。ETM直接连接到ARM内核而不是主AMBA系统总线。它将跟踪信息压缩并通过一个窄带跟踪端口输出。2.18 ETM接口简介简介2.18 ETM接口简介简介 外部跟踪端口分析仪在软件调试器的控制下捕获跟踪信息跟踪端口可以广播指令跟踪信息指令跟踪(或PC跟踪)显示了处理器的执行流程并提供所有已执行指令的列表指令跟踪被显著压缩为广播分支地址和一套用于指示流水线状态的状态信号跟踪信息的产生可通过选择触发源进行控制触发源包括地址比较器、计数器和序列发生器由于跟踪信息被压缩,软件调试器需要一个执行代码的静态映像由于这个限制,自修改代码无法被跟踪2.19 Load/Store体系结构体系结构简介同大多数RISC处理器一样,ARM使用Load/Store体系结构。这就意味着指令集仅能处理(指加、减等)寄存器中(或指令中直接指定)的值。而且总是将这些处理的结果放回到寄存器中。针对存储器状态的惟一操作是将存储器的值拷贝到寄存器(Load指令)或将寄存器中的值拷贝到存储器(Store指令)。典型的CISC处理器允许将存储器中的值加到寄存器中的值,有时还允许将寄存器中的值加到存储器中的值。ARM不支持这类“存储器存储器”操作。因此,所有的ARM指令都属于下列3种类型之一,即:2.19 Load/Store体系结构体系结构数据处理指令:这类指令只能使用和改变寄存器中的值。例如,一条指令能使两个寄存器相加,并将结果放到一个寄存器中。数据传送指令:这类指令把存储器中的值拷贝到寄存器中(Load指令)或把寄存器的值拷贝到存储器中(Stord指令)。另外一种形式仅在系统代码中有用,即交换存储器和寄存器的值。控制流指