最新嵌入是系统结构 第2讲 ARM技术与ARM体系结构PPT课件.ppt
嵌入是系统结构嵌入是系统结构 第第2 2讲讲 ARM ARM技技术与术与ARMARM体系结构体系结构2TM2第二讲第二讲 ARMARM技术与技术与ARMARM体系结构体系结构 n第一片第一片ARM处理器是处理器是1983年年10月到月到1985年年4月月 间间在位于英国剑桥的在位于英国剑桥的Acorn Computer公司开发公司开发 n1990年,年,ARM公司成立公司成立n20世纪世纪90年代,年代,ARM快速进入世界市场快速进入世界市场n1995年年 StrongARM 问世问世 nXScale是下一代是下一代StrongARM芯片的发展基础芯片的发展基础 nARM10TDMI是是ARM处理器核中的高端产品处理器核中的高端产品 nARM11是是ARM家族中性能最强的一个系列家族中性能最强的一个系列3TM34TM45TM56TM67TM78TM89TM9三三.处理器工作模式处理器工作模式n ARM 有有7个基本工作模式个基本工作模式:nUserUser:非特权模式,大部分任务执行在这种模式n正常程序执行的模式nFIQFIQ:当一个高优先级(fast)中断产生时将会进入这种模式n高速数据传输和通道处理nIRQIRQ:当一个低优先级(normal)中断产生时将会进入这种模式n通常的中断处理nSupervisorSupervisor:当复位或软中断指令执行时将会进入这种模式n供操作系统使用的一种保护模式nAbortAbort:当存取异常时将会进入这种模式n虚拟存储及存储保护nUndefUndef:当执行未定义指令时会进入这种模式n软件仿真硬件协处理器nSystemSystem:使用和User模式相同寄存器集的特权模式n特权级的操作系统任务10TM10r0r1r2r3r4r5r6r7r8r9r10r11r12r13(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)spsrFIQIRQSVCUndefAbortUser Moder0r1r2r3r4r5r6r7r8r9r10r11r12r13(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)spsrCurrent Visible RegistersBanked out RegistersFIQIRQSVCUndefAbortr0r1r2r3r4r5r6r7r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrent Visible RegistersBanked out RegistersUserIRQSVCUndefAbortr8r9r10r11r12r13(sp)r14(lr)FIQ ModeIRQ Moder0r1r2r3r4r5r6r7r8r9r10r11r12r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrent Visible RegistersBanked out RegistersUserFIQSVCUndefAbortr13(sp)r14(lr)Undef Moder0r1r2r3r4r5r6r7r8r9r10r11r12r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrent Visible RegistersBanked out RegistersUserFIQIRQSVCAbortr13(sp)r14(lr)SVC Moder0r1r2r3r4r5r6r7r8r9r10r11r12r15(pc)cpsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr13(sp)r14(lr)spsrr8r9r10r11r12r13(sp)r14(lr)spsrCurrent Visible RegistersBanked out RegistersUserFIQIRQUndefAbortr13(sp)r14(lr)Abort Moder0r1r2r3r4r5r6r7r8r9r10r11r12r15(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 寄存器寄存器11TM11寄存器组织概要寄存器组织概要Usermoder0-r7,r15,andcpsrr8r9r10r11r12r13(sp)r14(lr)spsrFIQr8r9r10r11r12r13(sp)r14(lr)r15(pc)cpsrr0r1r2r3r4r5r6r7Userr13(sp)r14(lr)spsrIRQUsermoder0-r12,r15,andcpsrr13(sp)r14(lr)spsrUndefUsermoder0-r12,r15,andcpsrr13(sp)r14(lr)spsrSVCUsermoder0-r12,r15,andcpsrr13(sp)r14(lr)spsrAbortUsermoder0-r12,r15,andcpsrThumb stateLow registersThumb stateHigh registersNote:System模式使用模式使用user模式寄存器集模式寄存器集12TM12ARM 寄存器寄存器nARM 有有37个个32-Bits长的寄存器长的寄存器.n1 个用作PC(program counter)n1个用作CPSR(current program status register)n5个用作SPSR(saved program status registers)n30 个通用寄存器n当前处理器的模式决定着哪组寄存器可操作当前处理器的模式决定着哪组寄存器可操作.任何模式都可以存取:任何模式都可以存取:n相应的r0-r12子集n相应的 r13(the stack pointer,sp)and r14(the link register,lr)n相应的 r15(the program counter,pc)n相应的CPSR(current program status register,cpsr)n特权模式特权模式(除除system模式模式)还可以存取;还可以存取;n相应的 spsr(saved program status register)13TM13程序状态寄存器程序状态寄存器n 条件位:条件位:nN=1-结果为负结果为负,0-结果为正或结果为正或0nZ=1-结果为结果为0,0-结果不为结果不为0nC=1-进位,0-借位nV=1-结果溢出,结果溢出,0结果没溢出结果没溢出nQ 位:位:n仅ARM 5TE/J架构支持n指示增强型DSP指令是否溢出nJ 位位n仅ARM 5TE/J架构支持nJ=1:处理器处于Jazelle状态n中断禁止位:中断禁止位:nI =1:禁止 IRQ.nF=1:禁止 FIQ.nT Bitn仅ARM xT架构支持nT=0:处理器处于 ARM 状态nT=1:处理器处于 Thumb 状态nMode位位(处理器模式位处理器模式位):n0b10000Usern0b10001FIQn0b10010IRQn0b10011Supervisorn0b10111Abortn0b11011Undefinedn0b11111System2731N Z C V Q2867I F T mode1623 815 54024 U n d e f i n e dJ14TM14n当处理器执行在当处理器执行在ARM状态状态:n所有指令 32 bits 宽n所有指令必须 word 对齐n所以 pc值值由bits 31:2决定,bits 1:0 未定义(所以指令不能halfword/byte对齐).n当处理器执行在当处理器执行在Thumb状态状态:n所有指令 16 bits 宽n所有指令必须 halfword 对齐n所以 pc值值由bits 31:1决定,bits 0 未定义(所以指令不能 byte对齐).n当处理器执行在当处理器执行在Jazelle状态状态:n所有指令 8 bits 宽n处理器执行 word 存取一次取4条指令程序指针程序指针PC(r15)15TM15Vector Table异常处理异常处理n当异常产生时当异常产生时,ARM core:n拷贝 CPSR 到 SPSR_n设置适当的 CPSR 位:n改变处理器状态进入 ARM 态n改变处理器模式进入相应的异常模式n设置中断禁止位禁止相应中断(如果需要)n保存返回地址到 LR_n设置 PC 为相应的异常向量n返回时返回时,异常处理需要异常处理需要:n从 SPSR_恢复CPSRn从LR_恢复PC nNote:这些操作只能在 ARM 态执行.Vector table can be at 0 xFFFF0000 on ARM720T and on ARM9/10 family devicesFIQIRQ(Reserved)Data AbortPrefetch AbortSoftware InterruptUndefined InstructionReset0 x1C0 x180 x140 x100 x0C0 x080 x040 x0016TM16nThe ARM 可以用可以用 little/big endian 格式存取数据格式存取数据.r0=0 x11223344STR r0,r1LDRB r2,r1r1=0 x100Memory3 2 1 0 0 1 2 3Byte Lane3124 2316 158 70112233443124 2316 158 70112233443124 2316 158 70112233443124 2316 158 70000000443124 2316 158 7000000011Little endianBig endianR2=0 x44R2=0 x11nFor more information,see:“Application Note:Big and Little Endian Byte Addressing”字节顺序字节顺序17TM17四四.ARM7TDMInARM7TDMI 是基于 ARM7 内核n3 级流水线-0.9MIPS/MHzn冯.诺依曼架构nCPI(Cycle Per Instruction)约为1.9 nT -Thumb 架构扩展,提供两个独立的指令集:nARM 指令,均为 32位nThumb指令,均为 16位n两种运行状态,用来选择哪个指令集被执行nD-内核具有Debug扩展结构nM-增强乘法器 支持64位结果.nI -EmbeddedICE-RT逻辑-提供片上断点和调试点支持18TM18ARM7TDMI 内核信号内核信号ARM7TDMI内核内核MCLKnIRQnFIQnRESETBUSENBIGENDISYNCnWAITVDDVSSAPEDBE协处理器接口协处理器接口存储器管理存储器管理存储器接口存储器接口ABORTnOPCCPBCPAnCPInTRANSnM4:0MAS1:0nRWnMREQLOCKSEQnENOUTA31:0DOUT31:0DIN31:0D31:0电源电源总线控制总线控制时钟时钟配置配置中断中断19TM19ARM7TDMI 方框图方框图ARM7TDMI内核内核TAP 控制器控制器JTAG 接口数据总线控制信号D31:0地址总线A31:0DIN31:0DOUT31:0BUSSplitterEmbeddedICE逻辑逻辑20TM20乘法器乘法器ARM7TDMI 内核内核指令指令解码解码地址地址自增器自增器nRESETnMREQSEQABORTnIRQnFIQnRWMAS1:0LOCKnCPICPACPBnWAITMCLKnOPCBIGENDISYNCnTRANSnM4:0D31:0桶形桶形移位器移位器32 位位 ALUDBE写数据写数据 寄存器寄存器读数据读数据 寄存器寄存器地址寄存器地址寄存器寄存器寄存器A31:0ABE及及控制控制 逻辑逻辑PC Update解码站解码站指令指令 解码解码IncrementerPCABusBBusALUBus21TM21外部地址产生外部地址产生PC31:2 ARM StatePC31:1 Thumb StateALU31:0INC自增器自增器A31:0向量向量0 x1C0 x00地址地址寄存器寄存器22TM22指令流水线指令流水线n为增加处理器指令流的速度,为增加处理器指令流的速度,ARM7 系列使用系列使用3级流水线级流水线.n允许多个操作同时处理,比逐条指令执行要快。n PC指向正被取指的指令,而非正在执行的指令指向正被取指的指令,而非正在执行的指令FetchDecodeExecute从存储器中读取指令解码指令寄存器读(从寄存器Bank)移位及ALU操作寄存器写(到寄存器Bank)PCPCPC-4PC-2PC-8PC-4ARMThumb23TM23 最佳流水线最佳流水线n该例中用该例中用6个机器周期执行了个机器周期执行了6条指令条指令n所有的操作都在寄存器中(单周期执行)所有的操作都在寄存器中(单周期执行)n指令周期数指令周期数(CPI)=1机器周期机器周期 操作操作周期周期 1 2 3 45 6 ADD SUB MOV AND ORR EOR CMP RSBFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteDecodeExecuteFetchDecodeFetchFetch24TM24 LDR 流水线举例流水线举例n该例中,用该例中,用6机器周期执行了机器周期执行了4条指令条指令n指令周期数指令周期数(CPI)=1.5 机器周期机器周期周期周期 操作操作123456 ADD SUB LDR MOV AND ORRFetchDecodeExecuteFetchDecodeExecuteFetchDecodeExecuteDataWritebackFetchDecodeExecuteFetchDecodeFetch25TM25分支流水线举例分支流水线举例n流水线被阻断流水线被阻断n注意注意:内核运行在内核运行在ARM状态状态周期周期 1 2 3 4 5 0 x8000 BL 0 x8004 X0 x8008 XX0 x8FEC ADD0 x8FF0 SUB0 x8FF4 MOV地址地址 操作操作FetchDecodeExecuteFetchDecodeExecuteFetchDecodeFetchFetchDecodeExecuteLinkretAdjustFetchDecodeFetch26TM26中断流水线举例中断流水线举例周期周期 1 2 3 4 5 6 7 8IRQn IRQ 中断的反应时间最小中断的反应时间最小=7机器周期机器周期地址地址 操作操作FDELinkret AdjustFFDecode IRQLinkretExecute IRQAdjustFDEFDFFDEFDFF0 x8000 ADD0 x8008 MOV0 x0018 B(to 0 xAF00)0 x8004 SUB0 x001C XX0 x0020 XXX0 xAF00 STMFD 0 xAF04 MOV0 xAF08 LDR0 x800C XD27TM27对齐对齐n存储器访问必须始终适当地保持地址对齐n非对齐地址将产生不可预测的/未定义的结果n用Data Abort 异常来检测无效的非对齐数据存取n扩展逻辑要求,或使用MMU在 720T,920T,926E-S,1020En谨防指令读取时出现非对齐n非对齐数据存取能够完成,但不是用 LDRn使用 LDRB,STRB 传递字节,或使用LDM 加移位/屏蔽字节访问字节访问(字节对齐字节对齐)半字访问半字访问(半字对齐半字对齐)字访问字访问(字对齐字对齐)3210765402468ace089abcdef48c28TM28T标志位的作用标志位的作用161632-bit data16A1MuxThumb指令指令解码解码MuxMuxT标志ARM指令指令解码解码阶段阶段 1阶段阶段 2D31:00110FetchDecodeExecute29TM29带带Cache的的ARM7TDMI nARM710Tn8K 统一的 cache n完整的内存管理单元(mmu),支持虚拟地址和存储器保护n写缓冲ARM720T同ARM710T,但支持 WinCEARM740T8K 统一的 cache内存管理单元写缓冲ARM7TDMI内核内核地址地址数据读AMBA接口接口写写缓冲缓冲MMU数据写数据ARM7xxT控制控制逻辑逻辑CacheAMBA总线总线接口接口JTAG 和非 AMBA 信号CP1530TM30五五.ARM9TDMInHarvard架构n增加了可用的存储器宽度n指令存储器接口n数据存储器接口n可以实现对指令和数据存储器的同时访问n5 级流水线n实现了以下改进:n提高了最大时钟频率31TM31ARM9TDMI流水线的变化流水线的变化InstructionFetch Shift+ALUMemoryAccessRegWriteRegReadRegDecodeFETCHDECODEEXECUTEMEMORYWRITEARM9TDMIARM or ThumbInst DecodeReg SelectRegReadShiftALURegWriteThumbARMdecompressARM decodeInstructionFetchFETCHDECODEEXECUTEARM7TDMI32TM32ARM9TDMI数据通道数据通道(1)寄存器寄存器BankALUCBADINFWD结果DADD数据递数据递增增向量指令递增指令递增IA字节旋转字节旋转/符号扩展符号扩展.MU 逻辑逻辑双向双向缓冲器缓冲器字节字节/半字半字复制复制MU逻辑单元包含有:多路复用器,乘法器和桶形移位器数据总线数据总线地址总线地址总线字节字节/半字半字指令地址总线指令地址总线33TM33ARM9TDMI 数据通道数据通道(2)寄存器BankPSR乘法器移位器ALUBAImmDINFWDBDATAADATA锁存锁存MU 逻辑逻辑(至至 IA 生成逻辑生成逻辑)结果34TM34周期周期操作操作ADD R1,R1,R2SUB R3,R4,R1ORR R8,R3,R4AND R6,R3,R1EOR R3,R1,R212345678LDRR4,R79FDEFDEWFDEWFDEWFDWEFDEWF 取指(取指(Fetch)D 解码(解码(Decode)E 执行(执行(Execute)I 互锁(互锁(Interlock)M 存储器(存储器(Memory)W 写回(写回(Writeback)ILDR互锁互锁 n本例中,用了本例中,用了7个机器周期执行个机器周期执行6条指令,条指令,CPI=1.2 机器周期机器周期。nLDR指令之后立即跟一条数据操作指令,由于使用了相同的寄存器,将会指令之后立即跟一条数据操作指令,由于使用了相同的寄存器,将会导致互锁导致互锁。WIM35TM35周期周期操作操作ADD R1,R1,R2SUB R3,R4,R1ORR R8,R3,R4AND R6,R3,R1EOR R3,R1,R2LDRR4,R7最佳流水线最佳流水线n本例中,用了本例中,用了6个机器周期执行个机器周期执行6条指令,条指令,CPI=1机器周期。机器周期。nLDR指令没有引起流水线互锁指令没有引起流水线互锁123456789FDEWFDEWFEWFDEWFDWEFDEWF 取指(取指(Fetch)D 解码(解码(Decode)E 执行(执行(Execute)I 互锁(互锁(Interlock)M 存储器(存储器(Memory)W 写回(写回(Writeback)MD36TM36LDM互锁互锁(1)n本例中,用了本例中,用了8个机器周期执行个机器周期执行5条指令,条指令,CPI=1.6n在在LDM期间,有并行的存储器访问和回写周期期间,有并行的存储器访问和回写周期周期周期操作操作LDMIA R13!,R0-R3SUB R9,R7,R8ORR R8,R4,R3AND R6,R3,R112345678STRR4,R99F 取指(取指(Fetch)D 解码(解码(Decode)E 执行(执行(Execute)MW-存储器和回写同时执行存储器和回写同时执行I 互锁(互锁(Interlock)M 存储器(存储器(Memory)W 写回(写回(Writeback)FDEWFDEWDEFDEWFMDWEIIIIIIMFMW MW MW37TM37LDM 互锁互锁(2)n本例中,用了本例中,用了9个机器周期执行个机器周期执行5条指令,条指令,CPI=1.8 n此处此处SUB 使用了使用了 R3,增加了一个额外的互锁周期来完成该寄存器数据的获取增加了一个额外的互锁周期来完成该寄存器数据的获取 n这种情况对任何LDM 指令,像带IA,DB,FD,等,都会发生。周期周期操作操作LDMIA R13!,R0-R3SUB R9,R7,R3ORR R8,R4,R3AND R6,R3,R112345678STRR4,R99F 取指(取指(Fetch)D 解码(解码(Decode)E 执行(执行(Execute)I 互锁(互锁(Interlock)M 存储器(存储器(Memory)W 写回(写回(Writeback)FDEWFDEWDEFDEWFMDWEMW MW MWIIIIIIMIIF38TM38ARM9TDMI系统举例系统举例ARM9TDMI数据数据存储器存储器指令指令存储器存储器CTRLDA.DD.CTRLIA.ID.GLUEGLUE注意注意:数据接口必须能够读取指令存储器中的数据数据接口必须能够读取指令存储器中的数据。为调试方便,建议数据接口能够读写指令存储器为调试方便,建议数据接口能够读写指令存储器。39TM39带带Cache的的ARM9TDMIARM9TDMID CacheI CacheMMUGLUE外部外部存储器存储器ARM920T2x 16K caches MMU支持虚拟地址和内存保护 写缓冲ARM940T2x 4K caches MPU写缓冲ARM9xxT40TM40ARM10E 系列概述系列概述nARM1020Env5TE架构nCPI 1.3n6 级流水线n静态分支预测n32kB 指令cache和32kB数据cachen支持“Hit under miss”n 非阻塞的执行单元n每周期64 位的 LDM/STM操作nEmbeddedICE逻辑-RT-IIn支持新的 VFPv1 结构nARM1022En同上,除了cache大小为16kBn对SUDL(single user design license)有效41TM41ARM10 与与ARM9的流水线对比的流水线对比指令指令取指取指 移位移位+ALU寄存器寄存器写写寄存器寄存器读读寄存器寄存器译码译码FETCHDECODEEXECUTEMEMORYWRITEARM9TDMIARM 或或 Thumb指令解码指令解码ARM10指令地址指令地址 生成生成移位移位+ALU数据数据 Cache 接口接口寄存器寄存器写写FETCHDECODEEXECUTEMEMORYWRITE寄存器寄存器读读+结果结果 前向迁移前向迁移+记分板记分板乘法乘法乘乘 加加协处理器协处理器 数数据接口据接口分支分支预测预测指令指令取指取指ISSUE寄存器寄存器访问访问数据数据+分支地址分支地址生成生成ARM 或或 Thumb指令解码指令解码协处理器协处理器 指令指令发出发出42TM42ARM10 整数单元数据通道整数单元数据通道寄存器寄存器BankPSR乘法器乘法器移位器移位器ALUBAImmBA结果CLZ写端口PC数据装载43TM43周期周期OperationLDR A B CADD A B1234567MUL AF-Fetch I-Issue D-Decode E-Execute M Memory Wb-Writeback Wl-Write to register using load port 顺序代码的执行顺序代码的执行 开始于开始于64位的对齐地址位的对齐地址Address0 x073340 x0732C0 x07330SUB B C0 x07328ADDA C0 x07324ADDB0 x07320Fetch to Buffer89MWlDWbDDWbDWbFDWbDEEEEEEFFFFFIIIIII44TM44六六.异常处理异常处理 中断处理软中断(SWI)处理其它异常处理45TM45Vector TableVector table can be at 0 xFFFF0000 on ARM720T and on ARM9/10 family devicesFIQIRQ(Reserved)Data AbortPrefetch AbortSoftware InterruptUndefined InstructionReset0 x1C0 x180 x140 x100 x0C0 x080 x040 x00异常处理异常处理n当异常产生时当异常产生时,ARM core:n拷贝 CPSR 到 SPSR_n设置适当的 CPSR 位:n改变处理器状态进入 ARM 状态n改变处理器模式进入相应的异常模式n设置中断禁止位禁止相应中断(如果需要)n保存返回地址到 LR_n设置 PC 位相应的异常向量n返回时返回时,异常处理需要异常处理需要:n从 SPSR_恢复CPSRn从LR_恢复PC nNote:这些操作只能在 ARM 态执行.46TM46异常优先级异常优先级n异常在当前指令执行完成之后才被响应异常在当前指令执行完成之后才被响应n多个异常可以在同一时间产生多个异常可以在同一时间产生n 异常指定了优先级和固定的服务顺序异常指定了优先级和固定的服务顺序:nResetnData AbortnFIQnIRQnPrefetch AbortnSWInUndefined instruction47TM47向量表指令向量表指令 32 Mbytes 4 KbytesLiteral pool containing address of Undef HandlerIRQ handler within 32MBytes Branch instruction rangeSWI Exception handler placed on applicable address boundaryFIQ handler follows vector table Undef handler outside 32MBytes branch instruction range0 x00 x10000 x20000000 xFFC0 x80 x180 x300000000 xFFFFFFFF0 x1C0 x4MOV PC,#0 x30000000B IRQ_handler0 x30008000IRQ HandlerSWI HandlerFIQ HandlerLDR PC,PC,#+0 xFF0Undef Handler0 x3000800048TM48ARM or Thumb?Thumb/ARM 混合应用程序ARM CodeARM CodeThumbCodeFIQIRQ(Reserved)Data AbortPrefetch AbortSoftware InterruptUndefined InstructionReset49TM49异常处理中的寄存器使用异常处理中的寄存器使用n与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:与异常发生相关的模式改变意味着所调用的异常处理程序至少要访问:n私有的 SP_(stack pointer).n私有的 LR_(link register).n私有的 SPSR_(saved program status register).n在 FIQ异常处理中,另有5个私有的通用寄存器(r8_fiq to r12_fiq).n其它的寄存器是所有模式公用的.n异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态异常处理程序必须确保其他的寄存器在退出前恢复到原来的状态n这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实这可以通过将任何正在使用的寄存器的内容保存在堆栈中,并在返回前恢复来实现现n任何所需寄存器的初始化要有应用程序的起始代码来完成任何所需寄存器的初始化要有应用程序的起始代码来完成50TM50外中断处理外中断处理nARM 有两级外部中断有两级外部中断 FIQ,IRQ.n可是大多数的基于可是大多数的基于ARM 的系统有的系统有 2个的中断源个的中断源!n因此需要一个中断控制器(通常是地址映射的)来控制中断是怎样传递给ARM的。n在许多系统中,一些中断的优先级比其它中断的优先级高,他们要抢先任何正在处理的低优先级中断。Note:通常中断处理程序总是应该包含清除中断源的代码。通常中断处理程序总是应该包含清除中断源的代码。地址映射地址映射中断控制器中断控制器nIRQnFIQARMMultiplePeripheralinterruptsourcesARM读控制器寄存器并找到IRQ/FIQ中断源ARM写外设寄存器清相应中断源51TM51FIQ vs IRQnFIQ 和和 IRQ 提供了非常基本的优先级级别提供了非常基本的优先级级别。n在下边两种情况下,在下边两种情况下,FIQs有高于有高于IRQs的优先级的优先级:n当多个中断产生时,FIQ高于IRQ.n处理 FIQ时禁止 IRQs.nIRQs 将不会被响应直到 FIQ处理完成.nFIQs 的设计使中断处理尽可能的快的设计使中断处理尽可能的快.nFIQ 向量位于中断向量表的最末.n为了使中断处理程序可从中断向量处连续执行nFIQ 模式有5个额外的私有寄存器(r8-r12)n中断处理必须保护其使用的非私有寄存器n可以有多个FIQ中断源,但是考虑到系统性能应避免嵌套。52TM52中断重新使能的问题中断重新使能的问题n当另外一个中断抢先当前中断时,如果程序员使用下边特殊的步骤来防止系统状当另外一个中断抢先当前中断时,如果程序员使用下边特殊的步骤来防止系统状态丢失态丢失,中断是可以嵌套:,中断是可以嵌套:n保存IRQ状态下的LR(LR_irq)n保存IRQ状态下的SPSR(SPSR_IRQ)n当中断可重入时,在中断处理程序中使用当中断可重入时,在中断处理程序中使用“BL”必须特别小心必须特别小心:n如果第二个中断产生,BL调用的返回地址(LR_irq)可能被冲掉,子程序将错误的返回 导致无限循环!n解决方法是在使用解决方法是在使用“BL”之前改变模式来避免之前改变模式来避免 LR_irq 被冲掉被冲掉n通常使用“System”模式(这时 BL 使用 LR_usr)n在处理程序结束,必须:在处理程序结束,必须:n切换回 IRQ 模式 n禁止中断(来避免在恢复SPSR_irq 到一个临时的寄存器中后它被冲掉).53TM53 C 可重入中断示例可重入中断示例IRQHandler SUBlr,lr,#4 STMFDsp!,lr MRSr14,SPSR STMFDsp!,r12,r14 MOVr12,#IntBase LDRr12,r12,#IntSource MRSr14,CPSR BICr14,r14,#0 x9F ORRr14,r14,#0 x1F MSRCPSR_c,r14 STMFDsp!,r0-r3,lr MOVr0,r12 BLC_irq_handler LDMFDsp!,r0-r3,lr MRSr12,CPSR BICr12,r12,0 x1F ORRr12,r12,0 x92 MSRCPSR_c,r12 LDMFDsp!,r12,r14 MSRSPSR_csxf,r14 LDMFDsp!,PC切换到 IRQ 模式同时禁止 IRQ.LR_irq,SPSR_irq 和工作寄存器(r12)压栈保护来避免下一次中断发生使它们被冲掉保存R0-3,LR_user 到 user 栈中,然后调用 C 子程序,中断源(R0)作为一个参数传入 C 处理函数。恢复LR_irq,SPSR_irq 和工作寄存器(r12),然后退出中断处理使用修正后的LR读/清中断控制器中断源切换到 System 模式同时使能 IRQ54TM54软中断软中断SWI 0 x01向量表用户程序用户程序(C/ASM)SWI 处理程序(ASM)(可选)SWI 处理程序(C)n用户程序调用用户程序调用 SWInSWI 中断处理程序包含汇编部分和可选用的中断处理程序包含汇编部分和可选用的 C 部分部分55TM55SWI 调用调用n汇编中汇编中,SWI 调用使用调用使用“SWI 中断号中断号”实现实现:SWI 0 x24n小心在汇编中如果小心在汇编中如果SWI 调用时处于调用时处于Supervisor模式将会冲掉模式将会冲掉LR_svc.n例如:在SWI处理程序中的二级调用n解决方法:在SWI调用之前对LR_svc 压栈保护nC 中中,使用关键词使用关键词“_swi”来定义一个软中断函数来定义一个软中断函数.For Examplecompiles to:_swi(0 x24)void my_swi(void);void foo(void)my_swi();foo STMFD sp!,lr SWI 0 x24 LDMFD sp!,pc56TM56nARM 内核不提供直接传递软中断内核不提供直接传递软中断(SWI)号到处理程序的机制:号到处理程序的机制:nSWI 处理程序必须定位SWI 指令,并提取SWI指令中的常数域n为此为此,SWI 处理程序必须确定处理程序必须确定SWI 调用是在哪一种状态调用是在哪一种状态(ARM/Thumb).n检查 SPSR 的 T-bitnSWI 指令在ARM 状态下在 LR-4 位置,Thumb 状态下在 LR-2位置nSWI 指令按相应的格式译码:ARM 态格式态格式:Thumb 态格式态格式:存取存取 SWI 号号283124270 Cond 1 1 1 1SWI number2315 8 7 01 1 0 1 1 1 1 1SWI number57TM57存取存取 SWI 参数参数n汇编中,存取调用者设置的寄存器即可汇编中,存取调用者设置的寄存器即可.n在返回之前,修改寄存器的值,传回参数给调用者.n传参数给传参数给C,通常采用压栈的方法通常采用压栈的方法.n将参数压栈n给调用的函数传递一个指向这些参数的指针n也可以通过将参数值写回到适当的堆栈位置,将参数传回58TM58复位复位(reset)nReset 处理程序执行的动作取决于不同的系统处理