470 likes | 719 Views
ARM 处理器开发. 杨传森. 数据. 指令译码器. 符号扩展. 写. 读. PC p15. 结果 to Rd. 寄存器文件 r0~r15. Rn. Rm. 桶型移位器. MAC. ALU. 地址寄存器. 加法器. 地址. ARM 内核的数据流模型. ARM 内核的数据流模型. ARM 流水线结构. 取指 译码 取操作数 执行运算 存储器访问 结果写回寄存器 各个阶段操作相互独立,采用流水线的重叠技术极大地提高了系统性能. 取 指令. 译码. 译码. Reg 读. 移位 /ALU 乘法. 地址 计算.
E N D
ARM处理器开发 杨传森
数据 指令译码器 符号扩展 写 读 PC p15 结果 to Rd 寄存器文件r0~r15 Rn Rm 桶型移位器 MAC ALU 地址寄存器 加法器 地址 ARM内核的数据流模型 • ARM内核的数据流模型
ARM流水线结构 • 取指 • 译码 • 取操作数 • 执行运算 • 存储器访问 • 结果写回寄存器 各个阶段操作相互独立,采用流水线的重叠技术极大地提高了系统性能
取 指令 译码 译码 Reg 读 移位 /ALU 乘法 地址 计算 乘法器 部分积 相加 Reg写 数据写 取指令 Thumb解压缩 ARM译码 Reg读 移位/ALU Reg写 取指令 译码 Reg读 移位/ALU 数据存储器访问 Reg写 ARM7、ARM9、ARM9E、ARM10在流水线方面的区别 • 取指 译码 执行 • 取指 译码 执行 存储器 写 • 取指发射译码执行存储器写
ARM7寄存器 R0--R7 : 通用寄存器 • R8_FIQ ---R12_FIQ:允许快速中断处理 • /R8_USER ---- R12_USER 其它态。 • R13,R14/USER:SYSTEM • R13,R14/FIQ R13,R14/管理态 • R13,R14/IRQ R13,R14/中止态 R13,R14/UNDEF • R13用于各工作态的堆栈寄存器 • R14用来保护程序调用的现场PC指针 • R15:pc
中断与异常 • 复位 0x00000000开始或0xffff0000开始 • 管理模式 IRQ 中断irq引脚产生,比Fiq优先级低。进入Fiq时,会屏蔽irq.0x000000018或0xffff0018 • FIQ 快速中断引脚产生,放在矢量表的最后,另外有自己的临时寄存器,提升中断响应 0x0000001c或0xffff001c • 异常进入均为ARM态,另外异常的返回各不相同。FIQ: movs pc,r14_fiq,#4 IRQ: movs pc,r14_fiq,#4 • Fiq/irq 的最大延迟时间:29个时钟周期。 • 最小延迟时间:5个时钟周期。
存储器和I/O • ARM采用了存储器映射I/O的方式,把I/O地址作为特殊的存储器地址。 • ARM体系同时支持大尾端/小尾端 • 小位端:11223344 --〉44,33,22,11。 • 32根地址线 • 32根数据线 • 内部cache • I/O采用内存映射的方式实现
LPC2200系列-ARM I/O结构 • 一般而言,ARM架构中的处理器核和处理器内核都没有I/O部件和模块,但是可以通过AMBA总线扩展。 • 存储器映射I/O:ARM采用了存储器映射I/O的方式,把I/O地址作为特殊的存储器地址。 • 中断IRQ和快速中断FIQ:一般的ARM没有DMA功能,系统安排了快速中断FIQ和中断IRQ来提高I/O处理能力。
ARM AMBA接口 • ARM内核通过内部总线选用Cache部件,通过协处理器接口扩充各种协议处理器, • 通过AMBA来扩展不同体系构架的宏单元及I/O部件
ARM7TDMI处理器三级流水线 • 增加处理器指令流的速度,(09MIPS/MHz) • 取指 • 译码 • 执行 • ARM7TDMI使用 Von Neumann结构:指令与数据共用一条32位总线。
处理器状态I • ARM7TDMI内核使用ARMv4T,该结构包含32位ARM指令集,16位Thumb指令集。
异常或入口 返回指令 前状态 ARM Thumb 备注 BL Mov pc,r14 Pc+4 Pc+2 SWI Mov pc,r14_svc Pc+4 Pc+2 未定义指令 Mov 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 中断 SUBS pc,r14_riq,#4 Pc+4 Pc+4 数据中止 SUBS pc,r14_abt,#8 Pc+8 Pc+8 复位 无 无 无 异常与中断 • 异常或入口
异常与中断 • 进入异常 在适当的LR中保存,下一条指令的地址。 CPSR复制适当的SPSR 根据异常将CPSR模式强制设为某一值 强制PC从相关的异常向量处取指
异常与中断 • 退出异常 将LR中的值减去偏移量后移入PC 将SPSR的值复制回CPSR 清零中断禁止标志(在入口中置位的)
异常与中断 • FIQ(快速中断) nFIQ信号由片外拉低,产生快速中断请求,支持数据转移和通道处理;在一个特权模式下,可通过置位CPSR中的F标志位,来禁止FIQ异常;当F标志清零时,ARM7TDMI在每条指令结束时检测FIQ同步器输出端的电平。
异常与中断 • IRQ 用于外部硬件(外设)中断处理器的正常执行流。在一个特权模式下,可通过置位CPSR中的I标志位,来禁止IRQ异常。
异常与中断 • 中止 表示当前对存储器的访问不能被完成。ABORT信号由内部存储管理器部件控制。
异常与中断 • 软件中断 SWI指令用于调用一个操作系统例程的机制。即软件中断进入管理模式,用于请求特定的管理函数。
异常与中断 • 未定义指令 处理器不能对一条指令译码时使用
异常与中断 • 复位 处理器上电后执行的第一条指令的位置。该指令使处理器转跳到初始化代码处。
复位 初始化 N 看门狗复位? Y Boot[1:0] =11? 执行用户代码(片外bank0) N Y Y 硬件配置 (P1.20 P1.26 boot1 boot2) 用户代码有效? 执行用户代码(片内flash) N P1.40=0? 运行ISP服务程序 复位流程处理 • LPC2210/2212/2214复位处理流程
ARM汇编规范 • AREA ARMex, CODE, READONLY • ;命名代码段的名称为ARMex • ENTRY ;标记要执行的第一条指令 • Start MOV R0,#10 ;设置参数 • MOV R1,#3 ; • ADD R0,R0,R1 ;R0=R0+R1 • Stop MOV R0,0x18 ;angel_SWI Exception • LDR R1,=0x20026 ;ADP_stopped exit • SWI 0x123456 ;ARM SWI • END ;文件结束
ARM汇编规范 • 通用格式: • {标号}{指令|指示符|伪指令}{;注释} • 标号:代表一个地址,段内标号的地址值在汇编时确定,段外标号地址值在链接时确定。
ARM指令集 • 寄存器寻址: ADD R0,R1,R2 • 立即寻址:ADD r0,r0,#3 ADD r0,r1,#&0f • 寄存器移位寻址: ADD R0,R1,R2,LSL #3 • 寄存器间接寻址: LDR R0,[R1] • STR R0,[R1]
ARM指令集 • 基址寻址: LDR R0,[R1,#4] • LDR R0,[R1,#4]! • LDR R0,[R1],#4 • STR R0,[R1,#4]!
ARM指令集 • 多寄存器寻址: • LDMIA R0,{R1,R2,R3} • 块拷贝寻址: • STMFD R13!,{R2-R9} /PUSH • LDMIA R0!,{R2-R9} • STMIA R1,{R2-R9} • LDMFD R13!,{R2-R9} /POP
ARM指令集 • 相对寻址: • BL SUBR • ADD RO,R1,R2 • SUBR ADD R1,R2,R3 • MOV PC,R14
ARM指令集 • 条件执行: • 所有的ARM指令可包含一个可选的条件码,只有在满足指定的条件时,带条件码的指令才能执行。 • 如果要指令的结果更新条件标志,需要在指令后面加S. • 一些指令eg:CMP,CMN,TST,TEQ不需要加s
ARM指令集 • EQ:/NE 等于/不等于 • CS/HS: CC/LO 大于或等于/小于 • MI:PL 负/正或零 • VS:VC 溢出/不溢出 • HI:LS 大于/小于或等于 • GE:LT 大于或等于/小于 -带符号 • GT:LE 大于/小于或等于 -带符号
ARM汇编程序设计 • 条件执行程序设计 ADD R0,R1,R2 ; R0= R1+ R2 (不更新) ADDS R0,R1,R2 ; R0= R1+ R2(更新标志位) ADDEQS R0,R1,R2 ;如果Z标志置位,则执行 R0= R1+ R2,更新标志位 CMP R0,R1 ;根据R0- R1的结果更新标志位
ARM汇编程序设计 • 传送类指令程序设计 1、 加载立即数:加载的含义是向寄存器/存储器赋值,而不单指LDR指令的加载指令。 MOV R0,0xff,30 ;R0=1020 等同于: MOV R0,#0x3fc ;R0=1020
ARM汇编程序设计 • 传送类指令程序设计 • 2、使用LDR伪指令加载立即数 LDR Rn,[PC,#offset] ;从地址[PC+offset] 向Rn加载一个字 例: LDR R1,=0x55555555
ARM汇编程序设计 • 传送类指令程序设计 3、使用ADR/ADRL伪指令加载指令 ADR Rn,Lable 使用LDR伪指令加载地址 LDR Rn,=const 或者LDR Rn,= Lable
Thumb于ARM指令集的区别 Thumb具有32位核的所有优点: • 32位寻址空间 • 32位寄存器 • 32位移位器和算术逻辑单元ALU • 32位存储器传送
Thumb于ARM指令集的区别 Thumb指令集于ARM指令集的区别: • 转移指令 • 数据传送指令 • 单寄存器加载和存储指令 • 多寄存器加载和存储指令 Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令
Load-store 指令 • 单寄存器Load-store 指令的寻址方式 回写前变址与前变址及后变址的区别: 回写前变址:在计算出新的地址后,要用新的地址更新基址寄存器的内容,然后再利用新的基址寄存器进行寻址。 前变址:也是利用对基址寄存器的改变值进行寻址,但己知寄存器在操作之后仍然保持原值。 后变址:要更新基址寄存器的内容,但它是利用基址寄存器的原值进行寻址。
单寄存器Load-store 指令的寻址方式 • 寻址方式
单寄存器Load-store 指令的寻址方式 • Pre: • r0=0x00000000 • r1=0x00090000 • Mem32[0x00090000]=0x01010101 • Mem32[0x00090004]=0x02020202 • 回写前变址: • post(1) • r0=0x02020202 • r1=0x00090004 • 前变址: • post(2) • r0=0x02020202 • r1=0x00090000 • 后变址: • post(3) • r0=0x01010101 • r1=0x00090004
多寄存器传送指令的寻址模式 • 格式:<LDM|STM> {<cond>}<寻址方式>Rn{!},<Register>{r^} • 多寄存器传送Load-store指令的寻址模式
多寄存器传送指令 • 指令格式: LDM{cond}<模式> Rn!,reglist{^} STM{cond}<模式> Rn!,reglist{^} Rn:基址寄存器,模式有8种 reglist:寄存器列表 !:该后缀表示最后的地址写回到Rn ^ :该后缀表示不允许在用户模式或系统模式下使用
多寄存器传送指令的寻址模式 • 举例图示 • Pre • Mem32[0x8018]=0x03 • Mem32[0x8014]=0x02 • Mem32[0x8010]=0x01 • R0=0x00008010 • R1=0x00000000 • R2=0x00000000 • R3=0x00000000
多寄存器传送指令的寻址模式 • LDMIA=r0!,{r1-r3} • Pre: Post: • r1=0x00000001, r2=0x00000002, r3=0x00000003 r0=0x801c r0=0x8010
多寄存器传送指令的寻址模式 • LDMIB=r0!,{r1-r3} • Pre: Post: • r1=0x00000002, r2=0x00000003, r3=0x00000004 r0=0x801c r0=0x8010
堆栈操作 • ARM体系结构使用多寄存器的Load-store指令完成堆栈操作。 • POP操作(出栈)使用一条多寄存器的Load指令,PUPH操作(入栈)使用一条多寄存器的Store指令。 • ARM制定了ARM-Thumb过程调用标准(ATPCS),定义了例程如何被调用,寄存器如何被分配。在ATPCS中,堆栈被定义为 递减式满堆栈,因此LDMFD和STMFD指令分别用来支持POP和PUPH功能。