关于ARM寄存器组及工作模式知识_第1页
关于ARM寄存器组及工作模式知识_第2页
关于ARM寄存器组及工作模式知识_第3页
关于ARM寄存器组及工作模式知识_第4页
关于ARM寄存器组及工作模式知识_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、关于ARM寄存器组及工作模式知识(周方辉)2012/8/10编改记录编写日期内容概要2012-08-10创建目 录1参考文献21.1内部参考文献21.2外部参考文献22名词解释23ARM核工作模式23.1程序状态寄存器33.2寄存器分组43.3何为特权(异常)模式63.4各种模式工作机制73.5各种模式工作返回用户模式机制94ARM核工作模式初始化参考代码111 参考文献1.1 内部参考文献内部参考文献指的是周方辉自生的百度博文中的文件。无内部参考文献。1.2 外部参考文献外部参考文献指的是相对于上述内部参考文献以外的文件。ARMv8_ISA_PRD03-GENC-010197-24-0.pd

2、fcortex_a8_r3p2_trm.pdfCortexA8TechRefManul.pdf2 名词解释CPSR:当前程序状态寄存器,其数值反映出当前程序运行的一些状态指示。SPSR:保存程序状态寄存器,在程序调用等情况下,需要保存一下当前程序状态寄存器的值(SPSR<=CPSR),便于日后回复。SP:堆栈指针寄存器,其值用于执行当前堆栈栈顶(或栈底)位置。PC: 程序指针寄存器,其值用于指向要执行的程序代码地址。LR:连接返回寄存器,保存要返回的地址,PC<=LR。3 ARM核工作模式常规CPU工作核心模块都是由:寄存器组和ALU两大模块组成,ALU完成数据的加工处理,寄存器用

3、来保存数据,这些数据是直接参与ALU运算。ARM的处理器也不例外。ARM处理器的寄存器分成许多组,不同的组完成不同环境下的工作,不过它们都共用一套ALU数据处理模块。ARM寄存器一般用了37个,Cortex A8的ARM核的寄存器多大40个。我们学习ARM工作模式需要了解和解决下面问题:ARM寄存器为什么要分组?又是如何分组?各组与CPU工作模式是如何关联?各个组或工作模式是如何切换的?我们在学习ARM寄存器分组工作模式之前,先来看一下很特殊的一个寄存器PSR程序状态寄存器。3.1 程序状态寄存器程序状态寄存器是一个32bits的寄存器,它记录和指示出当前程序运行状态。格式如下:3130292

4、82726-252423-2019-1615-10987654-0NZCVQIT1:0JDNMGE3:0IT7:2EAIFTM4:0条件状态位:N:Negative/Less than,负数/小于0,而置1。Z:Zero,为0时该位置1。C:Carry/Borrow/Extend,发生了进位/借位/扩伸,该位将置1。V:Overflow,溢出时该位置1。它们之间关系:指令中的条件编码码记助符PSR中标志位用意0000EQZ=1相等0001NEZ=0不相等0010CSC=1>=(无符号数)0011CCC=1<(无符号数)0100MIN=1负数0101PLN=0正数或为零0110VSV

5、=1溢出0111VCV=0未溢出1000HIC=1,且Z=0>(无符号数)1001LSC=0,且Z=1<=(无符号数)1010GEN=V>=(带符号数)1011LTN!=V<(带符号数)1100GTZ=0,且Z=V>(带符号数)1101LEZ=1,或N!=V<=(带符号数)1110AL忽略无条件执行Q:Sticky overflow,饱和计算溢出标志。(有符号运算,确保数的极性不会翻转)发生时溢出,该位置1。例如:假设8bits符号数据,125+9=127,133超过127成为负数,而Q算法保持127最大数,确保不会变成负数。IT7:0:7:2用于IF.EL

6、SE条件执行状态位。GE3:0:用于SIMD指令,大于或等于。使能控制位:A:A=1时,禁止不确定数据异常。I:IRQ中断使能位,当其置1时,禁止IRQ发生。F:FIQ中断使能位,当其置1时,禁止FIQ中断。指令类别状态位:J:Java state bit,当T为1时,J=0,表示执行Thumb指令状态,J=1表示执行ThumbEE指令状态。T:当其为1是表示执行Thumb指令状态(或ThumbEE,这依赖于J为要为1),当其为0时,表示执行ARM指令状态。When T=1,J=0 Thumb state,J=1 ThumbEE stateJT指令状态00ARM01Thumb10Jazelle

7、11ThumbEE工作模式位:用来指示不同组寄存器与ALU协同工作M4:0:工作模式,b10000(0x10)用户模式(User);b10001(0x11)快速中断模式(FIQ);B10010(0x12)向量中断模式(IRQ);B10011(0x13)管理模式(Supervisor);B10111(0x17)异常模式(Abort),取数据失败时发生;B11011(0x1B)未定义模式(Undefined),指令解码出错时发生;B11111(0x1F)系统模式(System)B10110(0x16)安全监视模式(Secure Monitor),主要用于安全交易。E:大端和小端标志,0小端,1为大

8、端存储。因为ARM总线都为32bits(4个字节)以上的,而数据的存取常规以8bits为(字节)单位,这样就会出现如何放置数据问题。规定数据高位放在高字节,低位的放在低字节的成为小端存取;反之,称之为大端存取。3.2 寄存器分组ARM芯片将寄存器分成很多个组,来运行不同模式下的程序,让CPU程序运行得更加稳健。下图是ARM寄存器分组图:User、System、FIQ、Supervisor、Abort、IRQ、Undefined和Secure monitor共8个组。其中User和System两个组的寄存器完全共用,Secure monitor是Cortex A8的ARM核开始追加的模式。 8中

9、寄存器各自拥有和可访问的寄存器:组名称可见寄存器公共部分私有部分UserR0-R15,CPSR无SystemR0-R15,CPSR无FIQR0-R7,CPSRR8_fiq-R14_fiq,SPSR_fiqSupervisorR0-R12,CPSRR13_svc-R14_svc,SPSR_svcAbortR0-R12,CPSRR13_abt-R14_abt,SPSR_svcIRQR0-R12,CPSRR13_irq-R14_irq,SPSR_irqUndefinedR0-R12,CPSRR13_und-R14_und,SPSR_undSecure MonitorR0-R12,CPSRR13_mo

10、n-R14_mon,SPSR_mon其中17个寄存器是各个组共用,(特别是R0-R7是每个组都共用的,另外R8和R14在FIQ模式中不共用,FIQ有自己的R8_fiq-R14_fiq替代它们),另外专多达23个专用的寄存器分散在各种模式组中。另外,许多寄存器都有专门用途,并且使用别名来操作。例如:R9->SB,静态基地址寄存器。R10->SL,数据堆栈限制指针。R11->FP,(frame pointer) 帧指针。R12->IP,(Intra-Procedure-call Scratch Register)子程序内部调用暂存寄存器。R13->SP,堆栈指针sta

11、ck pointerR14->LR,连接寄存器linker register,用于跳转后返回(PC<-LR)。R15->PC,程序计数器program counter,用于指向程序执行代码。ATPCS规则就使用了上述别名。3.3 何为特权(异常)模式这8组寄存器中,处理User外,其余7中都为特权模式或异常模式。我们可以给特权模式作如下规定:1、 对PSR寄存器中的模式位组有修改能力。2、 除了能访问共用寄存器外,还有自己的一些专用寄存器(System特权模式除外)。目前为止,除了User模式外,其它的都属于特权模式。何为异常模式:1、 异常模式都属于特权模式的类别。2、 都

12、有自己的专用模式处理程序入口地址(又称异常向量表),为CPU提供实时高效和智能服务。虽然也是8(8x4=32字节)个地址(存放指令,仅有一条,多数为跳转指令),但是它们与8种工作模式不是一一对应的。对应表异常地址表名称工作模式名称0x0000_0000ResetSupervisor0x0000_0004Undefined instructionUndefined0x0000_0008Software InterruptSupervisor0x0000_000CAbort PrefetchAbort0x0000_0010Abort DataAbort0x0000_0014Reserved在Cor

13、tex A8中可能归属Monitor模式,需确认。0x0000_0018IRQIRQ0x0000_001CFIQFIQ我们发现,8中模式中Supervisor和Abort各占用了两个表项,而User、System和Monitor没有任何关联,这是为什么?其一User模式是程序正常运行模式,它不需要进行特殊的异常处理,即User不是异常模式,所以它没有占任何表项;另外System是特权模式,但是它不是异常模式,所以也不需要占用任何表项,System与User完全共用寄存器,同时有能力进行模式切换(修改PSR寄存器的模式位),所以它是其它特权模式与User模式的交互桥梁。对于Secure Moni

14、tor模式来说,是安全模式,需要协处理器来启动该模块,方能工作。同时又并在8种模式之中,我推测,Reserved会留给该异常模式使用,但是需要认证。何为中断模式:1、 属于异常模式。2、 ARM核用来接入核外部的异常事件,称之为中断,FIQ和IRQ两种。各种模式关系图:3.4 各种模式工作机制工作模式切换2种方式:1、 程序手动切换,在某种特权模式下,可以切换到另外一个特权模式下,不过User用户模式没有这个能力,因为它不是特权模式。2、 异常切换,异常事件发生,可从User模式下切换到异常模式下,或从另外一种异常模式下切换到该异常事件模式下。CPSR、PC和SPSR_xxx、LR_xxx寄存

15、器工作关系:当发生异常时:LR_xxx将保存但前PC值,SPSR_xxx将保存CPSR,因为PC会继续存放异常模式下的指令地址,CPSR将继续反应异常模式下程序运行状态,所以要保存。发生异常时,这些动作硬件自动完成。同理:当异常程序结束时,CPSR<=SPSR_xxx,PC<=LR_xxx,恢复正常程序运行。各种SPSR_xxx进入模式时备份CPSR用,各种LR_xxx用来保存PC。退出异常时,用户在异常程序的末尾写入一条完成PC<=lr指令,就自动完成CPSR<=SPSR_xxx动作。CPSRSPSR_xxx和PC+4LR_xxx为一条指令完成,并非两条指令;同理SP

16、SR_xxxCPSR和LR_xxxPC也是一同指令一气呵成完成。R13_xxx寄存器用途(sp_xxx堆栈指针):指示相应异常模式下,私有堆栈空间,该堆栈可以完成异常模式下函数程序的切换参数传递。FIQ和IRQ特权模式(异常或叫中断模式):这两个特权模式是为Cortex-A8核以外的异常提供了处理接口。如按键、ADC转换成功和RTC等,这类相对Cortex-A8核来说(虽然这所有模块可能跟CortexA8一起都在一颗芯片上,如S5PC100)是外部打断了Cortex-A8核的正常运行,所以又称之为FIQ和IRQ中断模式。Cortex-A8对FIQ和IRQ中断是否响应,在CPSR中有F和I位来控

17、制,它们值为0表示允许响应,为1表示禁止响应,即FIQ和IRQ是可屏蔽中断,但是不能禁止中断事件发生,只是Cortex-A8内核不做响应而已。Supervisor特权模式(异常):进入Supervisor异常模式,一般有两种方式:硬件方式芯片复位(上电复位和复位引脚引发)和软件方式执行swi指令。Abort特权模式(异常):Abort异常模式,有Cortex-A8内部硬件自动引发,对内存数据的存取和指令预取失败会引发该异常。Undefined特权模式(异常):Undefined异常,由Cortex-A8内部硬件自动引发,当执行一条无法识别的指令时,将发生该异常。Secure Monitor特权

18、(异常)模式:Secure monitor异常,当有私密的数据程序(如货币交易)要执行时,用户软件调用SMI(SMC替代SMI指令)指令即可进入该模式。System特权模式:System特权模式是Cortex-A8的7个特权模式中唯一一个没有自己的程序入口地址,所以它不属于异常概念。Systemt特权模式有两个特点:1、 System特权模式下的工作寄存器与User用户模式下的寄存器完全一样,不多一个,也不少一个。2、 System特权模式能操作CPSR_mod权限,也就是说可以切换各种特权模式,访问他们的资源。上述特点使得System特权模式为其它6种特权(异常)模式下访问User模式下的资

19、源。也就是说,在6种异常特权模式下,通过将CPSR_mod设置成System模式下,来访问User模式下资源,完成后,再将CPSR_mod改回去就恢复原有异常模式。默认嵌套是禁止的。Thumb Execution Environment(ThumbEE),在Thumb-2基础上发展起来的,2005年发布,为Java之类服务。进阶SIMD(NEON)64bit和128bit单指令多重指令集(SIMD)。期中用户模式和系统模式共用寄存器组,为用户模式进入伪特权提供机制。ARM中各个异常处理响应优先级:Reset(Supervisor),优先级最高。Data Abort,优先权次之。FIQ,优先级排

20、到第3位。IRQ,优先级排到第4位。Prefetch Abort,优先级排到第5等级SWI,优先级排到第6等级。Undefined,优先级低7位。Secure Monitor,优先级最低。3.5 各种模式工作返回用户模式机制异常程序相关的代码行为原则:1.MOVS PC,LR 当PC作为目的寄存器时,S 表示pc给lr的同时,恢复SPSR_<MODE>到CPSR2.从SWI(管理模式)和undef异常返回:MOVS PC,LR3.从FIQ, IQR和预取异常(prefect abort)返回:subs pc, lr, #44.从数据异常(Data Abort)返回:SUBS PC,

21、 LR, #85.如果LR之前被压栈的话使用LDM “”: LDMFD SP ! , PC1、 发生中断时,将CPSR保存到SPSR_xxx中,改变CPSR_mod,将返回地址保存到LR_xxx中,将PC指向相应的中断向量地址。2、 中断返回程序中:中断类型返回指令说明SWI、SMC和UndefMOVS pc,lr执行中断后的程序,为什么没有-4?swi和smc指令产生,不同于其它异常方式,下一步指令就是要执行的指令,所以没有返回指令-4行为。FIQ、IRQ和Prefetch Abort SUBS pc,lr,#4执行中断后的程序,注意,Prefetch Abort属于指是在指令即将被执行时发

22、生,所以其只要-4尔不是-8,就重新取该指令。Data AbortSUB pc,lr,#8执行中断前的程序,重新存取数据。下图就是对两个异常中断返回偏移量的解析。注意:如果LR之前是被压入栈的,就用LDMxx sp!,pc指令返回。3、 同时将SPSR_xxx恢复到CPSR中。来自CortexA8TechRefManul.pdf文件如此描述:ARM_UAL.pdf中给出,现在版本中使用SMC来替代SMI,同时也用SVC替代SWI4 ARM核工作模式初始化参考代码以S5PC100的芯片内核为代表:/* *文档作用:A8芯片启动程序,使用汇编编写。*/.equELFIN_CLOCK_POWER_B

23、ASE,0XE0100000.equGPG3CON,0XE03001C0.equAPLL_MASK_OFFSET,0x00.equMPLL_MASK_OFFSET,0X04.equEPLL_MASK_OFFSET,0X08.equHPLL_MASK_OFFSET,0X0C.equCLK_DIV0_OFFSET,0X300.equCLK_DIV0_MASK,0X3FFF.equ CLK_DIV0_VAL, (1<<0)|(0<<4)|(3<<8)|(1<<12)|(1<<16).equAPLL_CON_OFFSET,0X100.equC

24、LK_DIV1_VAL,(1<<16)|(1<<12)|(1<<8)|(1<<4).equ CLK_DIV1_OFFSET,0x304.equAPLL_VAL,(1<<31 | 445<<16 | 4<<8 | 0).equMPLL_VAL,(1<<31 | 89<<16 | 2<<8 | 1).equEPLL_VAL,(1<<31 | 90<<16 | 3<<8 | 3).equHPLL_VAL,(1<<31 | 133<

25、;<16 | 6<<8 | 2).equ CLK_SRC0_OFFSET,0x200.equGPG3DAT,0XE03001C4.equMPLL_CON_OFFSET, 0X104.equEPLL_CON_OFFSET, 0X108.equHPLL_CON_OFFSET, 0X10c.extern mmu_setmtt;.text.global _start_start:bresetldrpc,_undefined_instructionldrpc,_software_interruptldrpc,_prefetch_abortldrpc,_data_abortldrpc,_

26、not_usedldrpc,_irqldrpc,_fiq_undefined_instruction: .word _undefined_instruction空操作_software_interrupt: .word _software_interrupt空操作_prefetch_abort:.word _prefetch_abort空操作_data_abort:.word _data_abort空操作_not_used:.word _not_used空操作_irq:.word IRQ_Handler_fiq:.word _fiq空操作reset:加载基地址DDIO344k_cortex_A

27、8_r3p2_tra.pdf中P94ldrr0,=0x34000mcrp15,0,r0,c12,c0,0设置处理器访问权限,能访问特权和用户模式 movr0, #0xfffffff mcrp15, 0, r0, c1, c0, 2设置EN=1,使用NEON和VFP模块 movr0, #0x40000000 fmxrfpexc, r0进入SVC模式mrs r0,cpsrbicr0,r0,#0x1forrr0,r0,#0xd3msrcpsr,r0ldrr0,=GPG3CON init gpio for ledldrr1,=0x1111strr1,r0 /* 关闭WTD */ldrr0,=0xea2

28、00000movr1,#0strr1,r0/* * 初始化 core clock 和 bus clock. */P166输入时钟12MHz,屏蔽时间参数3600(0xE10)=300uSldrr0, =ELFIN_CLOCK_POWER_BASE/*0xe0100000*/加载时钟配置寄存器的基地址movr1, #0xe00orrr1, r1, #0x10r1=0x310屏蔽时间值0.3mSstrr1, r0, #APLL_MASK_OFFSET APLL_MASK=0xE10strr1, r0, #MPLL_MASK_OFFSET MPLL_MASK=0xE10strr1, r0, #EPL

29、L_MASK_OFFSET EPLL_MASK=0xE10strr1, r0, #HPLL_MASK_OFFSET HPLL_MASK=0xE10设置CLK_DIV0(0xE010_0300)寄存器P173分频设置DOUTAPLL=MOUTapll/2ARMCLK = DOUTapll / 1,HCLK0 = DOUTarm / 4,PCLK0 = HCLK0 / 2,HCLK0_SECSS=DOUTd0_bus/2ldr r1, r0, #CLK_DIV0_OFFSETldrr2, =CLK_DIV0_MASKbicr1, r1, r2ldrr2, =CLK_DIV0_VAL(1<&l

30、t;16 | 1<<12 | 3<<8 | 0<<4 | 1<<0)orrr1, r1, r2strr1, r0, #CLK_DIV0_OFFSET 设置APLL_CON(0xE010_0100)寄存器P167将0x81bd0400(MDIV=0x1bd(445),SDIV=0,PDIV=4)值赋给APLL_CON寄存器实现FOUTAPLL=(MDIV*(FIN/PDIV)/2SDIV=1335MHz(50MHz到2000MHz)ldrr1, =APLL_VAL(1<<31 | 0x1bd<<16 | 0x4<<

31、;8 | 0)strr1, r0, #APLL_CON_OFFSET设置CLK_DIV(0xE010_0304)寄存器P174DOUTAPLL2 = MOUTAPLL / 1DOUTMPLL = MOUTAMPLL / 2DOUTMPLL2 = MOUTAMPLL / 2DOUTD1_BUS= MOUTAMPLL / 2PCLK = DOUTD1_BUS / 2ldr r1, r0, #CLK_DIV1_OFFSETldrr2, =CLK_DIV1_VALCLK_DIV1_VAL=(1<<16)|(1<<12)|(1<<8)|(1<<4)=0x1

32、1110orrr1, r1, r2strr1, r0, #CLK_DIV1_OFFSET设置MPLL_CON(0xE010_0104)寄存器P168将0x80590201(MDIV=0x59(89),SDIV=1,PDIV=2)值存入到MPLL_CON寄存器中实现FOUTMPLL=(MDIV*(FIN/PDIV)/2SDIV=267MHz(10MHz到600MHz之间)ldrr1, =MPLL_VALMPLL_VAL=(1<<31 | 89<<16 | 2<<8 | 1)=0x80590201strr1, r0, #MPLL_CON_OFFSET设置EPLL

33、_CON(0xE010_0108)寄存器P168将0x805a0303(MDIV=0x5A(90),PDIV=3,SDIV=3)值保存到EPLL_CON寄存器中FOUTEPLL=(MDIV*(FIN/PDIV)/2SDIV=45MHzldrr1, =EPLL_VALEPLL_VAL=(1<<31 | 90<<16 | 3<<8 | 3)=0x805a0303strr1, r0, #EPLL_CON_OFFSET设置HPLL_CON(0xE010_010C)寄存器P168将0x80850602(MDIV=0x85(133),PDIV=6,SDIV=2)值保存到HPLL_CON寄

温馨提示

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

评论

0/150

提交评论