您好,欢迎访问三七文档
ARM学习笔记本课程的主要学习内容1.基础部分ARM处理器的基础知识ARM指令系统伪操作和伪指令基于汇编语言的程序设计ARM存储系统异常中断处理2.应用部分基于ARM处理器的C程序设计DMA过程的实现利用定时部件实现定时对I/O端口编程学习ARM顺序:了解各种不同存储器的工作原理。学习ARMCore的汇编语言。C语言。嵌入式编译器ADS(ARMDevelopDuit)嵌入式调试器AXD硬件电路结构。异常事件及中断。相关控制接口。第二章ARM处理器的基础知识2.1ARM处理器模式2.2ARM寄存器介绍2.3ARM存储系统2.4ARM体系的异常中断ARM内核与SOCARM核就是中央处理器(CPU)的运算单元。一般有以下几个单元:1、逻辑运算单元。2、乘法器、移位器等。3、指令译码。4、各种寄存器。5、调试单元。通常ARM核都会加入写缓冲区(writebuffer)和高速缓存(cache),用来提高CPU与外界沟通效率。SOC就是把系统的全部功能都放到CPU里。它是一个系统整合的理念,用来提供特定性能的芯片。通常具有以下特点:1、运算式引擎:CPU或DSP2、内建存储器:Flashmemory、RAM、ROM3、总线接口4、其他特殊功能接口2.1ARM处理器模式1.处理器模式的分类(1)用户模式(User,user)冯·诺依曼体系结构:1、计算机完成任务是由事先编号的程序完成。2、计算机程序被事先输入到储存器中,程序运行结果,也被存放在存储器中。3、计算机能自动连续地完成程序。4、程序运行的所需要的信息和结果可以通过输入输出设备完成。5、计算机由运算器、控制器、存储器、输入设备、输出设备所组成。哈佛结构:1、程序存储器与数据存储器分开。2、提供较大的数据存储器带宽。3、适合于数字信号处理。4、大多数DSP都是哈佛结构。5、ARM9是哈佛结构。(2)快速中断模式(FIQ,fiq)---用于高速数据传输和通道处理(3)外部中断模式(IRQ,irq)----用于通常的中断处理(4)管理模式(Supervisor,svc)-----供操作系统使用的一种保护模式(5)数据访问中止模式(Abort,abt)---用于虚拟存储及存储保护(6)未定义指令中止模式(Undefine,und)-----用于支持通过软件仿真硬件的协处理器(7)系统模式(System,sys)-----用于特权级的操作系统任务除了用户模式之外的其它6种模式称为特权模式(Previlegedmode).在这些模式下,程序可以访问所有的系统资源.也可以任意地进行处理器模式的切换.其中,除了系统模式以外,其它5种特权模式又称为异常模式.2.处理器模式的切换(1)处理器模式可以通过软件控制进行切换.也可以通过异常中断的方式进行切换.(2)大多数的应用程序运行在用户模式下.这时,应用程序不能够访问一些受操作系统保护的系统资源.(3)应用程序不能直接进行处理器模式的切换.当需要进行处理器模式切换时,应用程序可以通过异常中,在异常中断的处理过程中实现处理器模式的切换.(4)当应用程序发生异常中断时,处理器进入相应的处理器模式.每一种处理器模式都有一组寄存器,供相应的异常中断程序使用.这样可以保证在进入相应的处理器模式时,用户模式下的寄存器不被破坏.(5)系统模式不是通过异常中断进入的,它和用户模式具有完全一样的寄存器.但系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换.它主要供操作系统使用.2.2ARM寄存器介绍ARM处理器共有37个寄存器.其中包括:31个通用寄存器,包括程序计数器(PC)在内.这些寄存器都是32位寄存器.6个状态寄存器.这些寄存器都是32位寄存器.但目前只使用了其中的14位.通用寄存器可分为3类:未备份寄存器,包括R0-R7备份寄存器,包括R8-R14程序计数器PC,即R15程序状态寄存器CPSR对于备份寄存器R13和R14来说,每个寄存器对应6个不同的物理寄存器.寄存器R13在ARM中经常用作堆栈指针.现场保护。寄存器R14又被称为连接寄存器(LR).主要有两个作用:保存子程序的返回地址保存异常中断程序的返回地址。当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到PC时,就实现了子程序的返回。MOVPCLR或者BLLR.程序计数器R15被称为PC.它的值为当前指令的地址值加8个字节.一条ARM指令固定占有4个字节的存储空间.所以PC总是指向当前指令的下两条指令.并且ARM指令是字对齐的,所以PC的第0位和第1位总是0.程序状态寄存器CPSRCPSR可以在任何处理器模式下被访问.每一种处理器模式下都有一个专用的物理寄存器,称为备份程序状态寄存器(SPSR).当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容.在异常中断程序退出时,可以用SPSR的内容来恢复CPSR.由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR.CPSR是一个32位的寄存器2.3ARM存储系统ARM存储系统中1个字单元包含4个字节单元.ARM存储系统中引入了半字的概念,1个半字单元包含2个字节单元.小端存储格式----高位地址保存高位数据大端存储格式----高位地址保存低位数据ARM存储系统的默认存储格式是小端存储格式2.4ARM体系的异常中断保存被中断程序:SPSR_modeCPSRR14_modereturnaddress恢复被中断程序:CPSRSPSR_modePCR14_modeCPSR是指用户模式的程序状态寄存器SPSR_mode是指即将进入的异常模式的备份程序状态寄存器R14_mode是指即将进入的异常模式的连接寄存器return_address是指异常中断处理程序的返回地址第三章寻址方式3.1ARM指令的基本特点3.2数据处理指令的操作数寻址方式3.3Load/Store指令的操作数寻址方式3.1ARM指令的基本特点一条ARM指令的字长为固定的32位,需要4个字节的存储空间.一条典型的ARM指令的语法格式如下所示:OPCODE{COND}{S}Rd,Rn,Shifter_operandOPCODE:指令的助记符,如ADD,MOV等等.{COND}:指令的执行条件.{S}:决定指令的运行是否影响CPSR值Rd:表示目标寄存器Rn:表示包含第一个操作数的寄存器shifter_operand:表示第二个操作数2.2数据处理指令的操作数寻址方式shifter_operand通常具有以下3种格式(1)立即数方式ADDR0,R0,#2;R0R0+21.如十六进制数在0x00到0xFF之间,则它一定是合法的1.若十六进制数0XFF则将十六进制的数转化成十进制2.如果这个十进制数能够被4整除则这个十六进制的立即数和合法的,否则是非法的3例如:0x101=257/4=64.25非法0x104=260/4=65合法(2)寄存器方式ADDR0,R0,R1;R0R0+R1(3)寄存器移位方式移位方式有以下的几种形式ASR算术右移最高有效位右移,同时用自身填入,最低位移C可以实现带符号数的除2运算例:ADDR0,R1,R2,ASR#1;R0R1+R2/2LSL逻辑左移最低位补0,最高位移入C实现无符号数的乘2运算例:ADDR0,R1,R2,LSL#2;R0R1+R2*4LSR逻辑右移最高位补0,最低位移入C实现无符号数的除2运算例:MOVR3,#2ADDR0,R1,R2,LSRR3;R0R1+R2/4ROR循环右移例:MOVR0,R0,ROR#8将R0循环右移8位RRX扩展的循环右移例:MOVR0,R0,RRXCR0[0]R0[31]C原来的值RRX操作只能右移1位2.3Load/Store指令的操作数寻址方式Load指令用于从内存中读取数据到寄存器中.指令的助记符为LDR.Store指令用于将寄存器中的数据保存到内存中.指令的助记符为STR.批量的Load/Store指令可以实现一组寄存器和一块连续的内存单元之间传输数据.各类型的Load/Store指令的寻址方式由两部分组成.一部分为一个基址寄存器,另一部分为一个地址偏移量.基址寄存器可以是任一个通用寄存器,地址偏移量有以下三种格式.(1)立即数(2)寄存器(3)寄存器及一个移位常数在寻址方式中,地址的计算方法有3种(1)偏移量方法(2)事先更新方法在这种方法中,基址寄存器中的值和地址偏移量作加减运算,生成操作数的地址.指令执行后,这个生成的操作数地址被写入基址寄存器.(3)事后更新方法在这种方法中,指令将基址寄存器的值作为操作数的地址执行内存访问.基址寄存器中的值和地址偏移量做加减运算,生成操作数的地址.指令执行后,这个生成的操作数地址被写入基址寄存器.(1)基本的Load/Store指令[Rn,#+/-offset_12]Rn为地址寄存器offset_12为12位的地址偏移量例:LDRR0,[R1,#4];R0[R1+4]LDRR0,[R1,#-4];R0[R1-4][Rn,#+/-Rm]例:LDRR0,[R1,R2];R0[R1+R2]LDRR0,[R1,-R2];R0[R1-R2][Rn,#+/-Rm,shift#shift_imm]Rm为寄存器中的数值经过移位或循环移位后生成的地址偏移量shift为移位运算符shift_imm为移位或循环移位的位数例:LDRR0,[R1,R2,LSL#2];R0[R1+R2*4][Rn,#+/-offset_12]!Rn为基址寄存器offset_12为12位的地址偏移量!表示采用了事先更新方法.在这种方法中基址寄存器中的值和地址偏移量作加减运算,生成操作数的地址.指令执行后,这个生成的操作数地址被写入基址寄存器.例:LDRR0,[R1,#4];R0[R1+4]LDRR0,[R1,#4]!;R0[R1+4],R1R1+4[Rn,#+/-Rm]!例:LDRR0,[R1,R2];R0[R1+R2]LDRR0,[R1,R2]!;R0[R1+R2],R1R1+R2[Rn,#+/-Rm,shift#shift_imm]!Rn为地址寄存器Rm为寄存器中的数值经过移位或循环移位后生成的地址偏移量shift为移位运算符shift_imm为移位或循环移位的位数例:LDRR0,[R1,R2,LSL#2];R0[R1+R2*4]LDRR0,[R1,R2,LSL#2]!;R0R1+R2*4[Rn],#+/-offset_12Rn为地址寄存器offset_12为12位的地址偏移量这种寻址方式采用了事后更新方法.在这种方法中,指令将基址寄存器的值作为操作数的地址执行内存访问.基址寄存器中的值和地址偏移量做加减运算,生成操作数的地址.指令执行后,这个生成的操作数地址被写入基址寄存器.例:LDRR0,[R1,#4];R0[R1+4]LDRR0,[R1,#4]!;R0[R1+4],R1R1+4LDRR0,[R1],#4;R0[R1],R1R1+4[Rn],#+/-Rm例:LDRR0,[R1,R2];R0[R1+R2]LDRR0,[R1,R2]!;R0[R1+R2],R1R1+R2LDRR0,[R1],R2;R0[R1],R1R1+R2[Rn],#+/-Rm,shift#shift_imm例:LDRR0,[R1,R2,LSL#2];R0[R1+R2*4]LDRR0,[R1,R2,LSL#2]!;R0LDRR0,[R1],R2,LSL#2;R0[R1],R1R1+R2*4(2)批量的Load/Store指令一条批量的Load/Store指令可以实现在一组寄存
本文标题:ARM学习笔记
链接地址:https://www.777doc.com/doc-2898544 .html