1.34k likes | 1.51k Views
项目二、 掌握开发嵌入式系统的必备知识. 本项目将对 ARM 技术进行全面论述,通过本部分内容的学习,使大家对 ARM 技术有个全面的了解和掌握,建立起以 ARM 技术为基础的嵌入式系统应用和以 ARM 核为基础的嵌入式 SoC 芯片设计的技术基础。. 任务一、 ARM 技术的相关知识. 一、 ARM 体系结构的技术特征 ARM 的体系结构采用了若干 Berkeley RISC 处理器设计中的特征 Load/store 体系结构 固定的 32 位指令 3 地址指令格式 也放弃了其它若干 Berkeley RISC 特征 寄存器窗口 延迟转移
E N D
项目二、 掌握开发嵌入式系统的必备知识 本项目将对ARM技术进行全面论述,通过本部分内容的学习,使大家对ARM技术有个全面的了解和掌握,建立起以ARM技术为基础的嵌入式系统应用和以ARM核为基础的嵌入式SoC芯片设计的技术基础。
一、ARM体系结构的技术特征 • ARM的体系结构采用了若干Berkeley RISC处理器设计中的特征 • Load/store体系结构 • 固定的32位指令 • 3地址指令格式 • 也放弃了其它若干Berkeley RISC特征 • 寄存器窗口 • 延迟转移 • 所有的指令单周期执行
二、 ARM处理器的两种工作状态 • ARM状态 32位,ARM状态下执行字对准的32位ARM指令; • Thumb状态 16位,Thumb状态下执行半字对准的16位Thumb指令。在Thumb状态下,程序计数器PC使用位1选择另一个半字。 ARM处理器的两种工作状态可以进行相互转化, 其转化方法为:
进入Thumb状态 当操作数寄存器Rm的状态位bit[0]为1时,执行BX Rm指令进入Thumb状态(指令详细介绍见第三章)。如果处理器在Thumb状态进入异常,则当异常处理(IRQ,FIQ,Undef,Abort和SWI)返回时,自动切换到Thumb状态。 • 进入ARM状态 当操作数寄存器Rm的状态位bit[0]为0时,执行BX Rm指令进入ARM状态。如果处理器进行异常处理(IRQ,FIQ,Undef,Abort和SWI),在此情况下,把PC放入异常模式链接寄存器LR中,从异常向量地址开始执行也可以进入ARM状态。
三、ARM处理器的七种工作模式 CPSR(当前程序状态寄存器)的低5位用于定义当前操 作模式 , 如下表示:
除用户模式外的其他6种模式称为特权模式 特权模式中除系统模式以外的5种模式又称为异常模式,即 • FIQ(Fast Interrupt Request) • IRQ(Interrupt ReQuest) • SVC(Supervisor) • 中止(Abort) • 未定义(Undefined)
五、ARM的异常中断 1、ARM异常中断的相应过程 • 将CPSR的内容保存到将要执行的异常中断对应的SPSR中 • 设置当前状态寄存器CPSR中的相应位 • 将引起异常指令的下一条指令的地址保存到新的异常工作模式的R14 • 给程序计数器(PC)强制赋值 • 每个异常模式对应有两个寄存器R13_<mode>、R14_<mode>分别保存相应模式下的堆栈指针、返回地址;堆栈指针可用来定义一个存储区域保存其它用户寄存器,这样异常处理程序就可以使用这些寄存器。 • FIQ模式还有额外的专用寄存器R8_fiq~R12_fiq,使用这些寄存器可以加快快速中断的处理速度。
2、ARM异常中断的返回 从异常中断处理程序中返回时,需要执行以下四个基本操作 • 所有修改过的用户寄存器必须从处理程序的保护堆栈中恢复(即出栈)。 • 将SPSR_mode寄存器内容复制到CPSR中,使得CPSR从相应的SPSR中恢复,即恢复被中断的程序工作状态; • 根据异常类型将PC变回到用户指令流中相应指令处 • 最后清除CPSR中的中断禁止标志位I/F。
六、 ARM数据类型和存储格式 ARM处理器支持以下6种数据类型: • 8位有符号和无符号字节。 • 16位有符号和无符号半字,它们以两字节的边界定位。 • 32位有符号和无符号字,它们以4字节的边界定位。 ARM数据的存储格式: 大端格式:数据的高位存放在低地址单元,数据低位存放高地址单元。 小端格式:数据的高位存放在高地址单元,数据低位存放低地址单元。
一、ARM寻址方式 所谓寻址方式是指根据指令编码找出操作数的方式方法。ARM处理器所支持的常见寻址方式有七种,分别介绍如下:
1、 立即数寻址 立即数寻址简称立即寻址,该寻址方式的特点是在指令中直接给出操作数,该操作数称为立即数。立即数以“#”号开头。 如:MOV R0,#0x1000 ADD R0,R1,#10
2、 寄存器寻址 寄存器寻址也称寄存器直接寻址,该寻址方式的特点是指令编码中所需要的操作数都是存放在寄存器中的,在指令中直接给出寄存器的编号。 如:ADD R0,R1,R2 ADD R0,R1,R2, LSL #2
3、 寄存器间接寻址 寄存器间接寻址是将操作数的地址存放在寄存中,操作数是存放在内存单元中的,在指令中给出存放操作数地址的寄存器名称,并用“[]”括起来。 如:LDR R0,[R1] STR R0,[R1]
4 、基址加变址寻址 基址加变址寻址又称为基址加偏址寻址,该寻址方式的特点是操作数的有效地址是一个基地址和一个偏移地址的和,用于访问基址附近的内存单元。偏移地址的范围不能超过基址前后4KB的范围。有三种表现模式,分别介绍如下:
1)、前变址模式 如:LDR R0,[R1,#4] 该指令的功能是将(R1)+4内存单元的32数据加载到R0寄存器中,加载完成后R1的值不变 。
2)、自动变址模式 如:如:LDR R0,[R1,#4]! 该指令的功能是将(R1)+4内存单元的32数据加载到R0寄存器中,加载完成后R1的值修改为(R1)+4。
3)、后变址模式 如LDR R0,[R1],#4 该指令的功能是将(R1)内存单元的32数据加载到R0寄存器中,加载完成后R1的值修改为(R1)+4。
5、堆栈寻址 堆栈是指按照“先进后出”的原则组织的一片连续的内存区域。指向堆栈的地址寄存器叫堆栈指针寄存器SP,用来访问堆栈区域。堆栈指针总是指向栈顶的。
1)、堆栈的生成方法 • 向上生成法:即访问内存单元是地址向低地址方向发展。 • 向下生成法:即访问内存单元是地址向高地址方向发展。
2)、堆栈的分类方法 • 满递增堆栈FA:堆栈随存储器地址的增大而递增,堆栈指针指向有效数据的最高地址或指向第一个要读出的数据位置。 • 满递减堆栈FD:堆栈随存储器地址的增大而递减,堆栈指针指向有效数据的最高地址或指向第一个要读出的数据位置。
空递增堆栈EA:堆栈随存储器地址的增大而递增,堆栈指针指向有效数据的最高地址的上一个空位置或指向第一个要读出的数据位置的上一个空位置。空递增堆栈EA:堆栈随存储器地址的增大而递增,堆栈指针指向有效数据的最高地址的上一个空位置或指向第一个要读出的数据位置的上一个空位置。 • 空递减堆栈ED:堆栈随存储器地址的增大而递增,堆栈指针指向最后压入堆栈数据的下一个空位置或指向第一个要读出的数据位置的下一个空位置。
3)、堆栈寻址的实现 在ARM指令中通过Load/Store类指令实现。 如:STMFD SP!,{R0-R7,LR} LTMFD SP!,{R0-R7,LR} 在Thumb指令中用PUSH和POP指令实现。 如:PUSH {R0-R7,LR} POP {R0-R7,LR}
6、块拷贝寻址 块拷贝寻址是将内存中的一个数据块拷贝到多个寄存器中,或是将多个寄存器的值拷贝到一块内存区域中。用LDM/STM指令实现。 如:LDM R1!,[R3-R8] STM R1!,[R3-R8]
7、相对寻址 相对寻址常用于程序设计中控制程序的执行流程,可以认为是基址是PC的基址加变址寻址,偏移地址常是程序中的符号地址。 如:BL s1 ADDEQ R0,R1,R2 S1: MOV PC,LR
二、ARM指令概述 ARM处理器支持ARM指令集和Thumb指令集,所有的ARM指令都是32位的,Thumb指令都是16位的,ARM处理器复位异常启动后总是执行ARM指令集,包括所有异常中断都自动进入ARM工作状态。所有ARM指令集都是有条件执行的,而Thumb指令集只有B指令才是有条件执行的。
1、ARM指令集的条件执行 在ARM指令集编码表中,统一使用高四位编码来表示条件编码,每种条件码用两个英文助记符来表示其含义,添加在指令码的后面表示指令执行时必须要满足的条件。ARM指令根据CPSR中的条件标志位的值来自动判断是否执行该条指令。当条件满足是,执行该条指令,否则跳过该条指令。
2、ARM指令的分类 ARM指令集是Load/Store类型的指令,只能通过它访问存储器,而其他类型的指令只能访问内部寄存器。ARM指令集有数据处理指令、转移指令、Load/Store指令、CPSR处理指令、异常产生指令和协处理器指令六大类。
3、ARM指令集的指令格式 ARM汇编指令的基本书写格式如下: <opcode>{cond}{S} Rd, Rn {,op2} 格式中的符号说明: • “<>”中的内容表示必选项,“{}”中内容表示可选项 • cond:表示条件后缀
S选项:有该选项表示将根据指令执行的结果更新CPSR中状态标志位的值,否则不更新S选项:有该选项表示将根据指令执行的结果更新CPSR中状态标志位的值,否则不更新 • Rd:表示目的寄存器 • Rn:表示存放第一个源操作数的寄存器 • OP2:表示存放第二个源操作数的寄存器或存储单元
三、 ARM指令集的详细介绍 1、数据处理指令 ARM的数据处理指令主要完成数据的算术运算和逻辑运算。按照数据处理的功能主要分为数据传送指令、算术运算指令、逻辑运算指令、位清除指令、比较指令、测试指令六种。
1)、数据传送指令MOV、MVN 书写格式:MOV/MVN{cond}{S} 目的操作数Rd ,源操作数Rn 功能描述:MOV指令的功能是把源操作数传送到目的操作数中进行保存;而MVN的功能是先把源操作数取反后再传送到目的操作数中。
说明:若设置S选项,则这两条指令根据结果更新N和Z标志;当第2操作数使用移位寻址时更新C标志,否则不更新;对V标志没有影响。说明:若设置S选项,则这两条指令根据结果更新N和Z标志;当第2操作数使用移位寻址时更新C标志,否则不更新;对V标志没有影响。 实例:设:(R2)=0x1000 MOV R1, R2; (R1)= 0x1000 MVN R1, R2; (R1)=0xFFFFEFFF
2)、算术运算指令 (1)加法指令ADD、ADC 书写格式: ADD/ADC{cond}{S} Rd,Rn1, Rn2 功能描述: ADD: Rn1+Rn2 ->Rd ADC: Rn1+Rn2+C ->Rd
说明:若设置S选项,则这两条指令根据结果更新N、Z、C、V标志。说明:若设置S选项,则这两条指令根据结果更新N、Z、C、V标志。 实例: 设(R1)=0x1000,(R2)=0x2000 C=1 ADD R0,R1,R2;(R0)=0x3000 ADD R0,R1,R2,LSR #2;(R0)=0x1800 ADC R0,R1,R2;(R0)=0x3001
(2) 减法指令SUB、SBC、RSB、RSC 书写格式: SUB/RSB/SBC/RSB{cond}{S} Rd,Rn1, Rn2 功能描述:SUB: Rn1-Rn2 ->Rd SBC: Rn1-Rn2–(-C) ->Rd RSB:Rn2-Rn1 ->Rd RSC: Rn2-Rn1-(-C) ->Rd
说明:若设置S选项,则这些指令根据结果更新N、Z、C、V标志。说明:若设置S选项,则这些指令根据结果更新N、Z、C、V标志。 实例:设(R1)=0x1000,(R2)=0x2000, C=1 SUB R0,R1,R2; (R0)=0xFFFFF000 SUB R0,R1,R2,LSR #2;(R0)=0x800 RSB R0,R1,R2; (R0)=0x1000 SBC R0,R1,R2; (R0)=0xFFFFF000
(3) 乘法指令MUL、MLA、UMULL、UMLAL、SMULL、SMLAL ①MUL简单乘法指令 书写格式:MUL{cond}{S} Rd,Rn1, Rn2 功能描述:(Rn1*Rn2 )0-31 ->Rd
②MLA乘加指令 书写格式:MLA{cond}{S} Rd,Rn1, Rn2,Rn3 功能描述: (Rn1*Rn2 + Rn3 )0-31 ->Rd ③无符号长乘指令UMULL 书写格式: UMULL{cond}{S} RdLO,RdHI, Rn1, Rn2 功能描述:(Rn1*Rn2 )0-31 -> RdLO ; (Rn1*Rn2 )32-63 -> RdHI
④无符号长乘加指令UMLAL 书写格式: UMLAL{cond}{S} RdLO,RdHI, Rn1, Rn2 功能描述:(Rn1*Rn2 )0-31 + RdLO -> RdLO;(Rn1*Rn2 )32-63 + RdHI -> RdHI ⑤有符号数长乘指令SMULL 书写格式: SMULL{cond}{S} RdLO,RdHI, Rn1, Rn2 功能描述:(Rn1*Rn2)0-31 -> RdLO; (Rn1*Rn2)32-63 -> RdHI
⑥有符号数长乘加指令SMLAL 书写格式: SMLAL{cond}{S} RdLO,RdHI, Rn1, Rn2 功能描述: (Rn1*Rn2 )0-31 + RdLO -> RdLO; (Rn1*Rn2 )32-63 + RdHI -> RdHI 说明:若设置S选项,则这些指令根据结果更新N、Z、C、V标志。
3)、逻辑运算指令AND、ORR、EOR 书写格式: AND/ORR/EOR{cond}{S} Rd,Rn1, Rn2 功能描述: AND:将Rn1和Rn2中的数据进行按位逻辑与运算,运算的结果保存在Rd中。 ORR:将Rn1和Rn2中的数据进行按位逻辑或运算,运算的结果保存在Rd中。 EOR:将Rn1和Rn2中的数据进行按位逻辑异或运算,运算的结果保存在Rd中。
说明:若设置S选项,则这些指令根据结果更新N和Z标志;若第2操作数使用移位运算,则更新C标志,否则不更新;不影响V标志。说明:若设置S选项,则这些指令根据结果更新N和Z标志;若第2操作数使用移位运算,则更新C标志,否则不更新;不影响V标志。
4)、位清除指令BIC 书写格式:BIC{cond}{S} Rd,Rn1, Rn2 功能描述:将Rn1和Rn2的反码进行按位与运算,结果保存在Rd中。 实例: BIC R8,R10,R0, RRX5 说明:若设置S选项,则这些该指令根据结果更新N和Z标志;若第2操作数使用移位运算,则更新C标志,否则不更新;不影响V标志。
5)、比较指令CMP、CMN 书写格式:CMP/CMN{cond} Rd,Rn 功能描述: CMP是正数比较指令,用(Rd)-(Rn)的结果更新状态标志位,结果不保存。 CMN是负数比较指令,用(Rd)+(Rn)的结果更新状态标志位,结果不保存。 说明:这两条指令根据结果更新N、Z、C、V标志,运算结果不保存。 实例:CMPGT R13,R7,LSL #3 CMN R0,#6400
6)、测试指令TST、TEQ 书写格式: TST/TEQ{cond} Rd,Rn 功能描述: TST位测试,将两个操作数进行按位与运算,根据结果更新状态标志位,结果不保存。 TEQ相等测试,将两个操作数进行按位异或运算,根据结果更新状态标志位,结果不保存。 说明:这两条指令根据结果更新N、Z、C、V标志,运算结果不保存。 实例:TST R0,#0X3F8 TEQ R10,R9