嵌入式微处理汇总—word版._第1页
嵌入式微处理汇总—word版._第2页
嵌入式微处理汇总—word版._第3页
嵌入式微处理汇总—word版._第4页
嵌入式微处理汇总—word版._第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。它是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。特点:1、形式多样、面向特定应用 2、处理器和处理器体系结构类型多 3、极其关注成本 4、 有实时性和可靠性的要求 5、操作系统一般是适应多种处理器、可剪裁、轻量型、实时可靠、可固化的嵌入式操作系统6、嵌入式系统开发需要专门工具和特殊方法。嵌入式系统的硬件是以嵌入式微处理器为核心,主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。嵌入式系统的软件是由初始化代码及驱动、嵌入式

2、操作系统和应用程序等软件有机地结合在一起形成系统特定的一体化软件。嵌入式微处理器是嵌入式系统的核心,其基础是通用的微处理器,但是具有体积小、重量轻、成本低、功耗低、工作温度宽、抗电磁干扰、可靠性强等特点,在集成度、体系结构、指令集、性能、功耗管理和成本等方面都有适应嵌入式系统应用的特性。总线是CPU与存储器和设备通信的机制,是计算机各部件之间传送数据、地址和控制信息的公共通道。嵌入式系统的存储器包括主存和外存(又称为辅存)。大多数嵌入式系统的代码和数据都存储在处理器可直接访问的存储空间即主存中,系统上电后在主存中的代码直接运行。主存储器的特点是速度快,一般采用ROM、EPROM、Nor Fla

3、sh、SRAM、DRAM等存储器件。目前有些嵌入式系统除了主存外,还有外存。外存是处理器不能直接访问的存储器,用来存放各种信息,相对主存而言具有速度慢、价格低、容量大的特点。在嵌入式系统中一般不采用硬盘而采用电子盘做外存,电子盘的主要种类有DOC(Disk On Chip)、NandFlash、CompactFlash、SmartMedia、Memory Stick、MultiMediaCard、SD(Secure Digital)卡等。嵌入式系统的大多数输入/输出接口和部分设备已经集成在嵌入式微处理器中,输入/输出接口主要有中断控制器、DMA、串行和并行接口等,设备主要有定时器(Timers

4、)、计数器(counters)、看门狗(watchdog timers)、RTC、UARTs、PWM(Pulse width modulator)、AD/DA、显示器、键盘和网络等。嵌入式微处理器的体系结构 :可以分为冯诺依曼(Von Neumann)结构或哈佛(Harvard)结构两大类。算术格式(Arithmetic Format) 由于低成本和低功耗的限制,大多数的嵌入式微处理器使用定点运算(fixed-point arithmetic),即数值被表示为整数或在1.0和1.0之间的分数,比数值表示为尾数和指数的浮点版本的芯片便宜。当嵌入式系统中需要使用浮点运算时,可采用软件模拟的方式实现

5、浮点运算,只不过这样要占用更多的处理器时间。 功能单元(Functional Units) 通常包括不止一个的功能单元,典型的是包含一个ALU、移位器和MAC,处理器通常用一条指令完成乘法操作。 流水线(Pipeline)通常采用单周期执行指令,可能导致比较长的流水线。 嵌入式微处理器的指令集一般要针对特定领域的应用进行剪裁和扩充。目前很多应用系统需要类似于DSP的数字处理功能。这些指令主要有:乘加(MAC)操作:它在一个周期中执行了一次乘法运算和一次加法运算。 SIMD类操作:允许使用一条指令进行多个并行数据流的计算。 零开销的循环指令:采用硬件方式减少了循环的开销。仅使用两条指令实现一个循

6、环,一条是循环的开始并提供循环次数,另一条是循环体。 多媒体加速指令:像素处理、多边形、3D操作等指令。性能低端(低价,低性能) 一般低端嵌入式微处理器的性能最多达到50MIPS,应用在对性能要求不高但对价格和功耗有严格要求的应用系统中。 中档,低功耗 中档的嵌入式微处理器可达到较好的性能(如150MIPS以上),采用增加时钟频率、加深流水深度、增加Cache及一些额外的功能块来提高性能,并保持低功耗。 多数嵌入式系统有功耗的限制(特别是电池供电的系统),它们不支持使用风扇和其他冷却设备。 降低工作电压:1.8v、1.2v甚至更低,而且这个数值一直在下降。提供不同的时钟频率:通过软件设置不同的

7、时钟分频。关闭暂时不使用的功能块:如果某功能块在一个周期内不使用,就可以被完全关闭,以节约能量。 提供功耗管理机制 运行模式(Running Mode):处理器处于全速运行状态下。 待命模式(Standby Mode):处理器不执行指令,所有存储的信息是可用的,处理器能在几个周期内返回运行模式。 时钟关闭模式(clock-off mode):时钟完全停止,要退出这个模式系统需要重新启动。影响功耗的其他因素还有总线(特别是总线转换器,可以采用特殊的技术使它的功耗最小)和存储器的大小(如果使用DRAM,它需要不断的刷新)。为了使功耗最小,总线和存储器要保持在应用系统可接受的最小规模。处理器的价格受

8、如下因素影响:处理器的特点:功能块的数目、总线类型等。 片上存储器的大小。芯片的引脚数和封装形式:如PQFP(Plastic Quad Flat Package)通常比BGA(Ball Grid Array Package)便宜。芯片大小(die size):取决于制造的工艺水平。代码密度(code density):代码存储器的大小将影响价格,不同种类的处理器有不同的代码密度:CISC芯片代码密度高,但结构复杂,其额外的控制逻辑单元使价格变得很高;RISC芯片拥有简单的结构,代码密度低,因为其指令集简单;VLIW代码密度最低,因为它的指令字倾向于采用多字节。ARM/Thumb的命名规范 以A

9、RMv开头ARM指令集的版本号(15)可变功能标识(T表示支持Thumb指令,M-表示支持乘法指令,E 增强型DSP指令,J Java加速器Jazelle,SIMD ARM媒体功能扩展),但是ARMv4和其上的版本缺省都支持M功能,因此ARMv4和其上的版本的标识中可以不用标识M.如果3中描述的功能不存在,则在该功能标识符前加x规则:ARMxyzTDMIEJF-S    x - 处理器系列 y - 存储管理/保护单元 z - cache T - 支持Thumb指令集 D - 支持片上调试 M - 支持快速乘法器 I - 支持Embedded ICE,支持嵌入式跟踪

10、调试 E - 支持增强型DSP指令J - 支持Jazelle F - 具备向量浮点单元VFP-S - 可综合版本 如ARM7TDMIARM内核采用RISC体系结构。ARM体系结构的主要特征如下:(1)大量的寄存器,并可以用于多种用途。(2)采用Load/Store体系结构。(3)每条指令都条件执行。(4)采用多寄存器的Load/Store指令。(5)单周期指令内同时完成移位操作和ALU。6)通过协处理器指令集来扩展ARM指令集。(7)体系支持Thumb指令集处理器有两种工作状态:ARM:32位,执行字对准的ARM指令Thumb:16位,执行半字对准的Thumb指令ARM和Thumb之间状态的切

11、换不影响处理器的模式或寄存器的内容进入Thumb状态:执行BX指令,并设置操作数寄存器的状态(位0)为1。在Thumb状态进入异常(IRQ, FIQ, UNDEF, ABORT,SWI etc.),当异常处理返回时自动转换到Thumb状态 进入ARM状态:执行BX指令,并设置操作数寄存器的状态(位0)为0。 进入异常时,将PC放入异常模式链接寄存器中,从异常向量地址开始执行也可进入ARM状态注:BX为跳转指令,跳转到指定地址执行指令。这样,当我们需要要跳转到Thumb指令处执行时,必须将指令地址的最后一位置1(指令实际传送地址给PC之前会把最低位的1清除掉的。这个1只是为了判断是要切换到Thu

12、mb状态,如果程序员想切换到Thumb则必须在地址最低位+1)。而bx再跳转到ARM指令时就无需考虑这些了,就不用像上面的+1处理了。ARM Cortex-A8处理器有40个32位寄存器寄存器 32个通用寄存器,1个程序计数器,7个状态寄存器这些寄存器不能同时看到,不同的处理器状态和工作模式确定哪些寄存器是对编程者是可见的。ARM 有40个32-Bits长的寄存器:32个通用寄存器(完全通用,用于存放数据或地址)1个PC,1个CPSR(current program status register),6个SPSR(saved program status registers)当前处理器的模式决

13、定着哪组寄存器可操作. 任何模式都可以存取: 相应的r0-r12(除FIQ模式外共用-FIQ只共用r0-r7)相应的 r13 (the stack pointer, sp) 和 r14 (the link register, lr)r15 ( the program counter, pc),所有模式共用。CPSR(current program status register, cpsr),所有模式共用特权模式 (除system模式) 还可以存取:相应的 spsr (saved program status register)Thumb状态寄存器集是ARM状态集的子集,程序员可以直接访问的寄

14、存器为:8个通用寄存器R0R7;程序计数器(PC);堆栈指针(SP);链接寄存器(LR);有条件访问程序状态寄存器( CPSR)。注意:在发生异常时,处理器自动进入ARM状态。异常发生时伴随的模式切换意味着, 被调用的异常处理程序会访问: 它自己的堆栈指针 (SP_<mode>)它自己的链接寄存器 (LR_<mode>)它自己的备份程序状态寄存器 (SPSR_<mode>)如果是FIQ异常处理, 5个其它的通用状态寄存器 (r8_FIQ to r12_FIQ)其它寄存器和原来模式下的寄存器是相同的R0-R7所有模式下,R0-R7所对应的物理寄存器都是相同的

15、这八个寄存器是真正意义上的通用寄存器,ARM体系结构中对它们没有作任何特殊的假设,它们的功能都是等同的。在中断或者异常处理程序中一般都需要对这几个寄存器进行保存。R8-R14访问的物理寄存器取决于当前的处理器模式,若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。 R8-R12各有两组物理寄存器:一组为FIQ模式,另一组是除FIQ以外的其他模式。R13-R14各有6个分组的物理寄存器,一个用于用户模式和系统模式,其他5个分别用于5种异常模式。R13(也被称为SP指针)被用作栈指针,通常在系统初始化时需要对所有模式下的SP指针赋值,当CPU在不同的模式时栈指针会被自动切换成相

16、应模式下的值。R14为链接寄存器(LR)有两个用途,一是在调用子程序时用于保存调用返回地址,二是在发生异常时用于保存异常返回地址。;中断模式堆栈的设置(涉及到CPSR格式和MSR指令)MSR CPSR_c, #0x000000D2 ;切换到中断模式LDR R1, = IrqStackMOV SP, R1 ;设置中断模式堆栈指针快速中断模式堆栈的设置MSR CPSR_c, #0x000000D1 ;切换到快速中断模式LDR R1, = FiqStackMOV SP, R1 ;设置快速中断模式堆栈指针;中止模式堆栈的设置;CPSR_c 表示只操作CPSR中的C(控制)域,也就是只修改低8位。在指令

17、系统中MSR指令中会说明。共有4个域,C 控制域屏蔽字节(psr7:0);X 扩展域屏蔽字节(psr15:8);S 状态域屏蔽字节(psr23:16); F 标志域屏蔽字节(psr31:24);R15用作程序计数器(PC),可以被读写 读到的PC的值是PC当前值加8(2个指令的长度,三级流水线情况下),写PC则转移到写入地址执行程序。ARM state:4字节对齐,最低两位 bits 1:0永远为0(V4以上版本,V3以下是把写入值与0XFFFFFFFC与操作) THUMB state:2字节对齐,最低位bit 0为0 ARM7TDMI内核包含1个CPSR(当前程序状态寄存器)和5个

18、供异常处理程序使用的SPSR。CPSR在所有的模式下都是可以读写的,反映了当前处理器的状态,其包含::4个条件标志(负(N)、零(Z)、进位(C)和溢出(V) )2个中断使能标志5个当前处理器的模式编码位其它的一些状态和控制标志(ARM/Thumb)CPSR中剩余的保留位被保留将来使用。为了提高程序的可移植性,当改变CPSR标志和控制位时,请不要改变这些保留位。另外,请确保您程序的运行不受保留位的值影响,因为将来的处理器可能会将这些位设置为1或者0。 外部中断:由于CPU外部的原因而改变程序执行流程的过程,属于异步事件,又称为硬件中断,可以被屏蔽。软件中断(又称自陷):表示通过处理器所拥有的软

19、件指令、可预期地使处理器正在执行的程序的执行流程发生变化,以执行特定的程序。自陷是显式的事件,需要无条件地执行。典型的自陷指令如Motorola 68000系列中的Trap指令、ARM中的SWI指令和Intel 80x86中的INT指令。异常:由CPU内部的原因(比如遇到非法指令)或外部的原因(比如访存的错误)引起的事件。在X86上,当有异常发生时CPU是到指定的向量地址读取要执行的程序的地址.Prefetch Abort:指令预读取触发,指令流水线中预读取的指令无效时。Data Abort 由数据异常触发,一般由三种访问存储器的指令引起,LDR/STR、SWAP、LDM/STM多数据传送指令

20、。快速响应中断.FIQ向量放在最后,允许FIQ异常处理程序直接放在地址0x0000001C或0xFFFF001C开始 的位置,也就是说直接从0x0000 0001C开始执行,这样省去了一个跳转指令。每个向量只有4个字节(一条指令)如何从向量表跳转到真正的异常处理程序处执行?(1)跳转指令B的跳转范围为±32MB,但很多情况下不能保证所有的异常处理函数都定位在向量的32MB范围内。(2)MOV PC,imme_value。这种办法将目标地址直接赋值给PC。但这种方法受格式限制不能处理任意立即数。这个立即数由一个8位数值循环右移偶数位得到(第三章详解)。(3)LDR PC,PC+offs

21、et。把目标地址先存储在某一个合适的地址空间,然后把这个存储器单元的32位数据传送给PC来实现跳转。这种方法对目标地址值没有要求,但是存储目标地址的存储器单元必须在当前指令的±4KB空间范围内。LDR PC,PC,#+0xFF0 ;PC PC+8+0xFF0相对寻址,把指定地址存储的地址值送给PC。与本条PC相比偏移了0XFF0即在中断向量表中不直接LDR PC,"异常地址".而是使用一个标号,然后再在后面使用DCD定义这个标号,其原因是:LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到32MB 范围,而现在这样在LDR PC, "xxx

22、x"这条指令不远处用"xxxx"DCD 定义一个字,而这个字里面存放最终异常服务程序的地址,这样可以实现4GB 全范围跳转。向量表中不直接LDR PC,“异常地址”.而是使用一个标号,然后再在后面使用DCD定义这个标号,其原因是:LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到32MB 范围,而现在这样在LDR PC, "xxxx"这条指令不远处用"xxxx"DCD 定义一个字,而这个字里面存放最终异常服务程序的地址,这样可以实现4GB 全范围跳转。 伪指令:DCD 用于分配一片连续的字存储单元并用

23、指定的数据初始化。格式:标号 DCD (或 DCDU ) 表达式reset_addr DCD Reset_Handler为数据Rest Handler分配内存,并使reset_addr指向这个数据(在此作为地址异常程序真正的入口地址),编译时会把这个标号替换为实际地址。 AREA vectors, CODE, READONLY ENTRYVector_Table LDR pc, reset_addr ; reset_addr为标号,后面同理 LDR pc, undef_addr LDR pc, swi_addr LDR pc, prefetch

24、_addr LDR pc, abort_addr NOP; Reserved LDR pc, irq_addr; 实际指令是LDR PC, PC, #-0xff0FIQ_Handler ; FIQ handler code, < 4kB in sizereset_addr DCD Reset_Handlerundef_addr DCD Undef_Handlerswi_addr DCD Swi_Handler数据定义( Data Definition )伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。本例用使用的是标号,后面对应的子程序段入口处应写

25、有对应的标号,编译时编译器会把标号替换为实际地址。IRQ中断的PC加载指令使用的是LDR PC, PC, #-0xff0,将在后面介绍PPT127页。执行本条指令时,由于有3级流水线,PC值此时是本条指令后2指令的地址,即PC=0x18+8=0x20H。而0x20H-0xff0=0xfffff030此为某个寄存器的地址,意思就是把这个寄存器中存放的值送给PC。ARM处理器响应异常的过程如下: 拷贝CPSR寄存器的内容至对应模式下的 SPSR_<mode>寄存器中;将返回地址保存到对应模式下的LR_<mode>寄存器中;对 CPSR 寄存器的一些控制位进行设置:无论发生异

26、常时处理器处于Thumb 状态还是ARM状态,响应异常后处理器都会切换到 ARM 状态,即CPSR5=0;将模式位 CPSR4:0设置为被响应异常的模式编码;设置中断屏蔽位:如果异常模式为Reset 或 FIQ 则 CPSR6=1 /*禁止快速中断*/ CPSR7=1 /*禁止正常中断*/将程序计数器(PC)设置为异常向量的地址下一条指令地址一般为PC-4,正在执行的指令是PC-8,当前取指令的PC值是PC,(ARM7是三级流水线)。如果是在thumb状态进入的IRQ异常则下一条指令地址是是PC-2(thumb指令是2字节,16位)从异常处理程序返回时(执行特定的异常返回指令,需注意对于复位异

27、常不需要返回),处理器执行下列动作:将SPSR_<mode>中的内容恢复到CPSR中;将PC设置为LR_<mode> 的值中断使能(进入异常处理程序入口时禁止了中断)同异常响应过程一样,上述过程只能在ARM状态下完成。复位异常处理所执行的指令依赖于所在的系统例如它可能:安装异常向量表,初始化存储系统 (例如: MMU/PU)初始化所有模式下的堆栈并设置寄存器 初始化 C 代码要求的变量初始化所有临界的 I/O 设备,使能中断改变处理器的模式和 / 或状态调用main函数进入应用代码内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变为

28、高电平时,ARM处理器执行下列操作:1.SPSR_svc=CPSR,R14_svc=不确定的值2.强制M4:0变为b10011(管理模式);3.置位CPSR中的I和F位;(禁止2种中断)4.清零CPSR中的T位;(进入ARM模式)5.强制PC从地址0x00开始对下一条指令进行取指;(如果配置的是高端向量,则地址为0XFFFF0000)未定义指令异常发生在:ARM 试图执行一条真正的未定义指令ARM 遇到一条协处理器指令,而在系统中该协处理器硬件上并不存在ARM 遇到一条协处理器指令,虽然该协处理器硬件上是存在的,但是并未被使能ARM 遇到一条协处理器指令,虽然该协处理器硬件上是存在的,但是因为

29、未处在特权模式,ARM 拒绝执行该指令例如访问 CP15 协处理器 系统控制协处理器响应:在异常处理程序中仿真实现不存在的协处理器或者其它的通用功能(例如:支持向量浮点运算)报告错误并且退出(返回时重新执行异常指令或跳过去执行下一条指令)在一个不包含浮点运算的系统中,CPU遇到浮点运算指令时,将发生未定义指令异常中断,在该未定义指令异常中断的处理程序中可以通过其他指令序列仿真浮点运算指令。发生未定义异常时,ARM处理器执行下列操作:1. PSR_svc=CPSR;R14_svc=未定义指令后的下一条指令地址2.强制M4:0变为b11011(未定义指令模式);3.置位CPSR中的I位;(禁止普通

30、中断IRQ)4.清零CPSR中的T位;(进入ARM模式)5.强制PC从地址0x00000004开始执行指令(如果配置的是高端向量,则地址为0XFFFF0004)1.指令预取中止异常表示取指令失败了取入一条被标记为无效的指令时;指令在流水线中执行时会引发;2.数据中止异常表示一个失败的数据访问在处理器和存储系统之间加载/存储数据 出错a.内部中止异常 是由内核自己引起的 - 如 MMU/MPUMMU 错误意味着你需要采取正确的措施并重新执行合适指令b.外部中止异常 是由存储系统引起的可能表示一个硬件错误可能是企图访问一个不存在的内存地址如何处理中止异常取决于所在的系统在一个没有内存管理的简单系统

31、中, 这通常代表一个严重的错误 (如: 硬件故障, 代码错误)若有内存管理机制, 那么需要确定中止异常的原因并采取正确的措施. 例如:为一个程序分配更多的内存为程序企图访问的数据或代码加载一个新的页面如果程序没有访问引起中止异常地址的权限,终止程序。对于指令预取中止异常, 引起异常指令的地址在 LR_abt 4处对于数据访问中止异常,引起异常指令的地址通常是 LR_abt - 8在 v4 和 v5TE版本中,有两个寄存器:FSR (故障状态寄存器) and FAR (故障地址寄存器)CP15 的 5 号(FSR)和 6 号寄存器 (FAR)v6 有分离的状态寄存器 - IFSR 和 DFSR

32、用来指示指令和数据都对应 CP15 的 5 号寄存器, 但是可在 MRC 指令的第二个操作数中指定如何复用 0 (DFSR) 或者 1 (IFSR) FSR 寄存器中的异常中止源:外部中止异常通常是致命的 (至少对在多任务操作系统下运行的处理器是这样)对于内部中止异常, 检查是否需要映射更多的内存或者程序是否在进行非法的数据访问 (如: 域错误, 访问特权级的内存)发生异常错误的地址在 FAR 寄存器中或者 (LR_abt - 4)对于数据中止异常, 需要注意不精确的中止异常(地址不一定是LR-8)注意:计算异常返回地址需要注意两点问题1.异常发生时PC寄存器的值是否已更新2.异常返回后,被打

33、断的指令是否需要重新执行校正异常返回地址的一大原因是 ARM7 的流水线为了向后兼容,更新的内核有相同的动作在 ARM 状态:在异常发生时自动设置 LR_mode = PC - 4异常处理程序可能需要矫正 LR_mode (取决于发生哪种异常) 以返回至正确的地址在Thumb 状态:根据异常的不同,存储在LR_mode 中的返回地址会被自动修正这保证了ARM 的返回指令会返回至正确的地址(不管异常发生时处于哪种状态)异常是由当前指令产生的,在计算返回地址时还未更新 PC 值 ARM Thumb SWI pc-8 pc-4 在这里发生异常 xxxÕ pc-4 pc-2 lr = SWI

34、的下一条指令 yyy pc pc返回地址为MOVS pc,lr注意 : Õ 标记表示从异常返回后即将执行的指令,硬件会自动把PC-4的值送给lrARM CPU Core能响应两级的外部中断 FIQ 和 IRQ,这提供了非常基本的优先级分级功能。FIQ 中断比IRQ 中断的优先级更高,主要体现在以下几个方面:当多个中断发生时,FIQ首先被处理在 响应 FIQ 中断时屏蔽了 IRQ 中断 (和 FIQ中断),直到FIQ中断处理程序完成,IRQ中断才会被处理 异常返回地址总结以下特性能够让CPU Core能够尽快地响应FIQ中断:FIQ 向量在异常向量表的最后,这样使FIQ处理程序可以直接

35、从FIQ向量处开始,省去了跳转的时间开销;FIQ 模式下有五个额外的寄存器 (r8_FIQ to r12_FIQ),对于这些寄存器在进入和退出FIQ时无须保存和恢复,节省了时间;FIQ中断可以打断IRQ中断,反之则不行;FIQ 中断源可以有多个, 但是为了最好的系统性能应该避免FIQ中断的嵌套,应该避免在 FIQ 中断处理程序内又有另一个异常发生。 ARM 有两级外部中断 FIQ,IRQ.可是大多数的基于ARM 的系统有 >2个的中断源!因此需要一个中断控制器(通常是地址映射的)来控制中断是怎样传递给ARM的。在许多系统中,一些中断的优先级比其它中断的优先级高,他们要抢先任何正在处理的低

36、优先级中断。Note: 通常中断处理程序总是应该包含清除中断源的代码。向量中断控制器(Vectored Interrupt Controller, VIC)。向量中断控制器(VIC)负责管理芯片的外设部件的中断信号,是外设中断源和CPU内核之间的桥梁。主要工作:标记中断请求;设置是否屏蔽;优先级管理;给出中断服务程入口地址。S5PV210中断系统:4个VIC-PL192、4个TVIC(TrustZone VIC)-SP890:93个向量IRQ中断;多优先级(16);具有保护模式(user模式下无法访问VIC寄存器);某一中断源产生IRQ中断请求时会依次通过VIC2、VIC1、VIC0,最终才会

37、提交给处理器内核,所以在中断服务函数中做清除中断处理时,要将4个的VICADDRESS寄存器都要做写操作(清除中断标记)。中断输入请求可以在VIC中被设置为以下三类:FIQ中断:具有最高优先级;向量IRQ中断:具有中等优先级;非向量IRQ中断:具有最低优先级;Cortex A8没有非向量IRQ中断这个功能,当然也没有默认向量地址寄存器VICDefVectAddr;每个VIC具有32个向量中断,因此编号0-31;没有控制寄存器Cnt(优先级16级),取而代之的是优先级寄存器VIC0VECPRIORITY(0-31)-优先级16级(只用到低4位进行优先级编码);上图中Cortex A8 VIC-P

38、L192与ARM7的VIC区别(部分):Cortex A8没有非向量IRQ中断这个功能,当然也没有默认向量地址寄存器VICDefVectAddr ;每个VIC具有32个向量中断,因此编号0-31;没有控制寄存器Cnt(优先级16级,把每个个优先级用编码分配给16个中断),取而代之的是优先级寄存器VIC0VECPRIORITY(0-31)-优先级16级(只用到低4位对每一个中断源进行优先级编码) ;Cortex A8 具有更多功能对应更多寄存器,详见芯片手册565页;部分寄存器名称写法与ARM7的有区别;寄存器物理地址不同VIC最多支持16个向量IRQ中断,这些中断被分为16个优先级,并且为每个

39、优先级指定一个服务程序入口地址。在发生向量IRQ中断后,相应优先级的服务程序入口地址被装入向量地址寄存器VICVectAddr中,通过一条ARM指令即可跳转到相应的服务程序入口处,所以向量IRQ中断具有较快的中断响应。 任何中断源都可以设置为非向量IRQ中断。它与向量IRQ中断的区别在于它不能为每个非向量IRQ中断源设置服务程序地址,而是所有的非向量IRQ中断都共用一个相同的服务程序入口地址。 当有多个中断源被设置为非向量IRQ中断时,需要在用户程序中识别中断源,并分别作出处理。所以非向量IRQ中断响应延时相对较长。下图:Cortex A8 S5PV210的VIC 中断服务程序地址寄存器名字V

40、ICADDRESS注意:任何IRQ中断产生之后,微控制器跳转到地址0x18执行代码,该地址处的指令为: LDR PC, PC, #-0xff0在执行该指令时,PC指向当前指令后的第2条指令,即地址0x20。该指令将内存地址: 0x20-0xFF0 0xFFFFF030处的内容存入PC,该地址正是 VICVectAddr寄存器的地址(见PPT115页)。 所以一条ARM指令即可实现程序向中断服务程序的跳转。VICADDRESS寄存器地址是0xffffff00,第一条指令PC =0x20,0x20-0x120=0xffffff00就是此寄存器的地址。VICIntSelect 寄存器中32位对应32

41、个中断源, 对应位置1,表明把相应中断源设定为FIQ状态。清0,表明设置为IRQ状态。外部中断标志寄存器EXTINT(0xE01FC140,复位时,无中断标志) ,对某位写入1(电平触发方式下,引脚无效时,该操作才有效),清除该位对应的中断号的中断标志;VICIntEnable寄存器 bit14为EXINT0外部中断0的使能位使用VIC的注意要点如果在片内RAM中调试程序,并使用了中断,那么必须将存储器映射控制设置为内部RAM模式;将多个中断源设置为FIQ,将增加中断响应延时,所以建议FIQ中断只有一个中断源;ADS1.2规定在定义中断服务函数时必须加入关键字“_irq”,保证函数返回时会切换

42、处理器模式;在退出中断服务程序时要清零相应外设的中断标志,以及VICVectAddr寄存器,为响应下次中断作好准备。大端低地址存首,小段低地址存尾。ARM 的I/O端口都是内存映射的方式,即对I/O端口的访问与内存的访问的方式完全一样。通常将I/O所映射的存储系统标识为非高速缓存(uncachable)和非缓冲(unbufferable)。 ARM寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。1.寄存器寻址;2.立即寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.块拷贝寻址;9.相对寻址。寄

43、存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOVR0,R2,LSL #3;R2的值左移3位,结果放入R0, ;即是R0=R2×8 ANDSR1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R1寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下: LDRR1,R2;将R2指向的存储单元的数据读出;保存在R1中 SWPR

44、1,R1,R2;将寄存器R1的值和R2指定的存储 ;单元的内容交换 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下: LDRR2,R3,#0x0C ;读取R3+0x0C地址上的存储单元 ;的内容,放入R2 STRR1,R0,#-4! ;先R0=R0-4,然后把R1的值寄存 ;到保存到R0指定的存储单元 多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下: LDMIAR1!,R2-R7,R12 ;将R1指

45、向的单元中的数据读出到 ;R2R7、R12中(R1自动加1) STMIAR0!,R2-R7,R12 ;将寄存器R2R7、R12的值保存到R0指向的存储单元中(R0自动加1)堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等; 空递增:堆栈向上增

46、长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等; 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。 多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。 如:STMIAR0!,R1-R7;将R1R7的数据保存到存储器中。存储指针在保存第一个值之后增加,增长方向为向上增长。STMIBR0!,R1-R7;将R1R7的数据保存到存储器中。存储指针在保存第一个值之前增加,增长方向为向上增长。 相对寻址是基址寻址的一种变通。由程序计数器PC提

47、供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BLSUBR1;调用到SUBR1子程序BEQLOOP;条件跳转到LOOP标号处LOOPMOVR6,#1 当处理器工作在ARM状态时,几乎所有的指令均可根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行。 每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。B 无条件跳转BEQ 相等则跳转,即当CPSR中的Z标志置位时发生跳转实际即判断r1是否等

48、于1。R1不等于1,则减一后Z标志无效,循环。等于一后Z被置一,同时退出循环。<opcode> <cond> S <Rd> ,<Rn>,<operand2> 灵活的使用第2个操作数“operand2”能够提高代码效率。第二个操作数通过桶型移位器传输到ALU它有如下的形式:Rm寄存器方式;Rm,shift寄存器移位方式;#immed_8r8位常数表达式;1.寄存器方式,操作数即为寄存器的数值。例如:SUBR1,R1,R2 ;R1=R1-R2MOVPC,R02. 寄存器移位方式:移位的值可为以下的两种:5位的无符号整数(031)其它寄存器

49、的最低字节用来实现乘以/除以一个常数ADD r0, r5, r5 LSL 1 à r0 = r5 x 3 ADDR1,R1,R1,LSL #3;R1=R1+R1*8=9R1SUB R1,R1,R2,LSR R3;R1=R1-(R2/2R3)3.立即数范围在 0-255的8位立即数 AND R1,R2,#0xff;数据0XFF直接参与运算或者能够通过一个8位立即数循环右移偶数位得到的数如:MOV     R3, #0x7F00  0X7F00是合法立即数 AND R1,R2,#0X04800000;0X12

50、右移10位即可ARM 指令都是32 位定长的举例表示:AND R1,R2,#0xff     当处理器处理这条指令的第二操作数0xff时,因为0xff为8位二进制数,所以处理器就将其直接放进8位“基本”数中,而4位“移位”数则为0。 AND R1,R2,#0X04800000;是合法的,因为可以把0X12循环右移10位可以得到此数说明:如何判断一个立即数是否符合8位图法第一,判断一个数是否符合8位位图的原则,首先看这个数转换成二进制后1的个数是否不超过8个,如果不超过8个,再看这n个1(n<=8)是否能同时放到8个二进制位中,如

51、果可以放进去,再看这八个二进制位是否可以循环右移偶数位得到起初被判断的那个数值,如果可以,则此数值即为符合8位图原理,否则,不符合。第二,用12位的编码来表示一个任意的32位数是不可能的,只能通过循环右移八位二进制数偶数位来得到一部分32位数,其余的无法表示的32位数,只有通过其它途径获得了,比如0xffffff00,可以通过0x000000ff按位取反得到,还可以通过字符池加载32位立即数,一定要注意用到的第二操作数是否符合8位图。为了加载更大的立即数, 汇编器提供了伪指令:LDR rd, =const这将:产生一条 MOV 或者 MVN 指令 或者产生一条 PC相对寻址的LDR 指令将立即

52、数从literal pool (嵌入在代码中的常数域)里读出来ARM指令集主要包括6大类指令: 数据处理指令:如ADD、SUB、AND等加载存储(Load-Store)指令:如LDR等分支指令:如B、BL等;状态寄存器访问指令:如MRS、MSR等;协处理器指令:如LDC、STC等;异常处理指令:如SWI等Thumb指令集是16位的指令集,它对C代码的密度进行了优化,平均达到约ARM代码大小的65%。为了尽量降低指令编码长度,Thumb指令集具体采用了如下约束: 不能使用条件执行,而对于标志则一直都是根据指令结果进行设置的源寄存器和目标寄存器是相同的只使用低端寄存器,即不使用寄存器R8-R12对

53、指令中出现的常量有大小的限制不能在指令中使用内嵌的桶型移位器(inline barrel shifter)Thumb-2 指令集主要是对Thumb指令集架构的扩展,其设计目标是以Thumb的指令密度达到ARM的性能。它具有如下特性 增加了32位的指令,因而实现了几乎ARM指令集架构的所有功能完整保留了16位的Thumb指令集编译器可以自动地选择16位和32位指令的混合具有ARM态的行为,包括可以直接处理异常、访问协处理器以及完成v5TE的高级数据处理功能通过If-Then (IT) 指令,1-4条紧邻的指令可以条件执行Jazelle技术使得ARM核可以执行8位的Java字节码,约95%的JAV

54、A字节码可以由硬件执行,从而使效率显著提高。数据处理指令 逆向减法运算指令RSB指令将operand2的值减去Rn,结果保存到Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 应用示例: RSB R3,R1,#0xFF00;R3=0xFF00-R1 RSBS R1,R2,R2,LSL #2;R1=(R2<<2)-R2=R2×3 带进位逆向减法指令RSC指令用寄存器operand2减去Rn,再减去CPSR中的C条件标志位,结果保存到Rd中。指令格式如下: RSCcondS Rd,Rn,operand2 应用示例(使用RSC指令实现求64位数值的负数 )

55、: RSBS R2,R0,#0 ;R2=-R0 C=0 R0:保存的是64位数据低32位 RSC R3,R1,#0 ;R3=-R1-0 R1:保存的是64位数据高32位 位清除指令BIC指令将寄存器Rn的值与operand2的值的反码按位作逻辑“与”操作,结果保存到Rd中。指令格式如下: BICcondS Rd,Rn, operand2 应用示例: BIC R1,R1,#0x0F;将R1的低4位清零,其它位不变 BICR1,R2,R3;将R3的反码和R2相逻辑“与”,;结果保存到R1中 比较指令CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下: CMPcondRn, operand2 应用示例: CMPR1,#10 ; R1与10比较,设置相关标志位CMPR1,R2; R1与R2比较,设置相关标志位 注意:CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据的大小判断时,常用CMP指令及相应的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论