1.1ARM体系结构概述2.1指令集体系结构1.一条ARM指令的最高四位bit[31:28]为条件域(conditionfield),根据其值的不同来确定当前指令对CPSR中的N、Z、C和V标志的设置与否。2.ARM指令集支持一个向前或向后32M范围内跳转的Branch指令。如果是BranchandLink指令,则除了支持向前或向后的32M范围跳转外,还能将跳转指令的下一条指令地址(返回地址)压入R14(LR)。而在ARMv4以上支持T的版本中,还有BranchandExchange指令,此指令可以拷贝通用寄存器Rm的值到PC中,而若其bit[0]为0,则进行ARM至Thumb的切换。3.ARM指令集中包含了状态寄存器获取指令MSR和MRS用来对CPSR和SPSR进行操作。同时ARM指令集还提供了对协处理器的操作指令MCR和MRC。4.SWI提供了软件中断的功能,此指令的bit[23:0]为一个立即数,ARM处理器会忽略这个立即数,但这个立即数可以提供异常处理程序使用。2.2寄存器通用寄存器(r0-r15):不分组寄存器r0-r7:可以工作在所有的处理模式下,没有隐含的特殊用途分组寄存器r8-r14:分组寄存器的使用取决于当前的处理器模式,每种模式有专用的分组寄存器用于快速异常处理。寄存器R13通常用作堆栈指针,称作sp。每种异常模式都有自己的R13。通常R13被初始化为指向异常模式分配的堆栈。在入口处,异常处理程序将用到的其他寄存器的值保存到堆栈中,返回时,重新将这些值加载到寄存器中。寄存器R14用作子程序链接寄存器lr。当指令BL指令时,得到R15(PC)寄存器的备份。程序寄存器R15:ARM状态下,PC位[1:0]为0(字对齐)。Thumb状态下,位[0]为0(半字对齐)。由于流水线特性,PC总是指向当前执行指令的下两条指令地址。程序状态寄存器:所有处理器模式下都访问相同的CPSR,CPSR包含条件码标志。中断禁止位,当前处理器模式以及其他状态和控制信息。每种异常模式下都有一个程序状态保存寄存器,发生异常时,SPSR用来保存CPSR的状态。2.3工作模式和特权等级ARM工作模式:ARM工作状态:从编程的角度看有两种并可以切换ARM状态:执行32位字对齐的ARM指令THunb状态:执行16位的半字对齐thumb指令注意:ARM状态下只能执行ARM指令thumb也是存储器格式:0-3第一个字4-7第二个……………….因此ARM最大寻址是4GB大端格式:高字节存放在低地址空间小端空间:高字节放高地址,低地址存放低字节ARM绝大多数时候使用小端格式指令长度:ARM支持字节,半字,字三种数据类型其中字需要4字节对齐(地址的低两位是0)半字需要2字节对齐(地址最低位0)工作模式:1:用户模式usr:正常执行程序2:快速中断模式FIQ:用于高速数据的传送3:外部中断模式IRQ:用于通常的中断处理4:管理模式svc:superverzer超级模式,操作系统使用的保护模式5:数据访问终止模式abt:当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护6:系统模式sys:运行具有特权的操作系统任务7:未定义指令终止模式und:当未定义的指令执行时进入该模式,可用于支持硬件除用户模式外,其它称为非用户模式,或者是特权模式除去用户模式和系统模式,其它称为异常模式.2.4存储器和映射1.多数的系统需要通过以下的一些方式来初始化和控制存储系统设备:1)使能Cache,以保证Cache执行所能获得的效益最大化2)为虚拟存储系统建立虚拟到物理存储的映射3)为不同的存储区域建立约束规则4)保证在正确的时间,以正确的方式对存储映射I/O的获取2.存储系统应该按以下的方式配置:1)主存储区(RAM)应该被配置成cachable和bufferable;2)ROM存储区通常只配置成cachable和只读,因此bufferable属性不会被设置。3.一些ARM实现中包含了一种契入式的writebuffer,将多次对同一位置的写操作归并成对主存储区的一次操作。此外一些writebuffer还支持写操作的重排序,那样会使处理器提交的写操作顺序与实际的写操作提交给存储区的顺序存在差异。因此,对I/O区域尽量不要配置成bufferable,以保证对I/O设置的写操作能以一个正确的顺序执行。4.所有存储和系统相关的特性都由协处理器15(CP15)来控制,因此CP15也被称为系统控制协处理器。其包含共计16个32位的主寄存器。此外,由于寄存器获取指令中可以包含额外的位来辨识特定的寄存器版本和(或者)对寄存器特定的获取方式,所以实际CP15种的32bit物理寄存器可以超过16个。CP15的属性可以是只读、只写或者可读可写。5.ARM仅仅定义了一类对CP15操作的指令,即MCR和MRC,其中MCR用来将一个ARM寄存器的值写入CP15,而MRC指令可以将一个CP15寄存器的值读入ARM寄存器中。MRC和MCR指令只有在各个特权模式下才能正常执行,如果是在用户模式下执行这两条指令,则会导致一个未定义指令的异常发生。CP15Register1中各个位的含义如下:M(bit[0])MMU或保护单元使能位A(bit[1])对齐错误校验使能位C(bit[2])Cache使能位(如果是统一cache架构,则标识统一cache使能,如果是独立cache架构,则标识数据cache使能)W(bit[3])Writebuffer使能位P(bit[4])异常处理模式选择位,可选择进入26-bit模式或32-bit模式D(bit[5])26-bit地址异常校验使能位L(bit[6])Abort模式版本选择位B(bit[7])大端或小端配置位S(bit[8])系统保护位(在基于MMU的存储系统中使用)R(bit[9])ROM保护位(在基于MMU的存储系统中使用)F(bit[10])该位由用户实现定义Z(bit[11])跳转预测使能位I(bit[12])指令cache使能位V(bit[13])常规/高异常向量选择位RR(bit[14])cache预测策略使能位L4(bit[15])Load类指令如果地址最低位为1,选择是否支持ARM和Thumb间自动切换Bit[31:16]未定义3寻址方式寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。1.寄存器寻址;2.立即寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.块拷贝寻址;9.相对寻址。1,立即寻址立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBSR0,R0,#1;R0减1,结果放入R0,并且影响标志位MOVR0,#0xFF000;将立即数0xFF000装入R0寄存器2,寄存器寻址操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2;将R2的值存入R1SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R03,寄存器移位寻址寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,;即是R0=R2×8ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相;“与”操作,结果放入R14,寄存器间接寻址寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDRR1,[R2];将R2指向的存储单元的数据读出;保存在R1中SWPR1,R1,[R2];将寄存器R1的值和R2指定的存储;单元的内容交换5,多寄存器寻址多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIAR1!,{R2-R7,R12};将R1指向的单元中的数据读出到;R2~R7、R12中(R1自动加1)STMIAR0!,{R2-R7,R12};将寄存器R2~R7、R12的值保;存到R0指向的存储;单元中;(R0自动加1)6,基址寻址基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDRR2,[R3,#0x0C];读取R3+0x0C地址上的存储单元;的内容,放入R2STRR1,[R0,#-4]!;先R0=R0-4,然后把R1的值寄存;到保存到R0指定的存储单元7,堆栈寻址堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。8,块拷贝寻址多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。如:STMIAR0!,{R1-R7};将R1~R7的数据保存到存储器中。;存储指针在保存第一个值之后增加,;增长方向为向上增长。STMIBR0!,{R1-R7};将R1~R7的数据保存到存储器中。;存储指针在保存第一个值之前增加,;增长方向为向上增长。9,相对寻址相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;调用到SUBR1子程序BEQLOOP;条件跳转到LOOP标号处...LOOPMOVR6,#1...SUBR1...(end)4.MDK开发工具4.1RealViewMDK简介RealViewMDK(RealViewMicrocontrollerDevelopmentKit)开发套件源自德国Keil公司,被全球超过10万的嵌入式开发工程师验证和使用,是ARM公司目前最新推出的针对各种嵌入式处理器的软件开发工具。RealViewMDK集成了业内最领先的技术,融合了中国多数软件开发工程师所需的特点和功能。包括μVision集成开发环境与RealView编译器,支持ARM7、ARM9和最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析等功能。RealViewMDK的特点:自动生成启动代码:RealViewMDK开发工具可以帮您自动生成完善的启动代码,并提供图形化的窗口,随您轻松修改。无论对于初学者还是有经验的开发工程师,都能大大节省时间,提高开发效率。提供软件模拟器:RealViewMDK的设备模拟器可以仿真整个目标硬件,包括快速指令集仿真、外部信号和I/O仿真、中断过程仿真、片内所有外围设备仿真等。开发工程师在无硬件的情况下即可开始软件开发和调试,使软硬件开发同步进行,大大缩短开发周期。而一般的ARM开发工具仅提供指令集模拟器,只能支持ARM内核模拟调试。提供性能分析器:RealViewMDK的性能分