历史上的今天
返回首页

历史上的今天

今天是:2024年09月18日(星期三)

正在发生

2021年09月18日 | ARM9_S3C2440学习(二)ARM状态下的寄存器组织

2021-09-18 来源:eefocus

ARM状态下的寄存器组织见图2.3。ARM有37个32位长的寄存器,包括31个通用寄存器、1个当前程序状态寄存器CPSR(current program status register)、5个备份的程序状态寄存器SPSR(saved program status register)。这37个寄存器并不都是同时可见的。在任意时刻,只有16个通用寄存器(R0~R15)和一个或者两个状态寄存器(CPSR和SPSR)对处理器来讲是可见的。


1. 通用寄存器

31个通用寄存器用R0~R15表示,可以分为三类:
●未分组寄存器R0~R7。
●分组寄存器R8~R14。
●程序计数器PC(R15)。

(1)未分组寄存器R0~R7

  在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。

 

(2)分组寄存器R8~R14

  对于分组寄存器,它们每一次所访问的物理寄存器与处理器当前的运行模式有关。

  对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用FIQ模式时,访问寄存器R8_fiq~R12_fiq;当使用除FIQ模式以外的其他模式时,均访问寄存器R8_usr~R12_usr。


  对于R13、R14这两个寄存器来说,每个寄存器各有6个不同的物理寄存器,其中的一个是用户模式与系统模式共用的,另外5个物理寄存器分别用于5种异常模式。


  采用以下的记号来区分不同的物理寄存器:
R13_
R14_
其中,mode为以下几种模式之一:USR、FIQ、IRQ、SVC、ABT和UND。

  寄存器R13通常用作堆栈指针SP(stack pointer),但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。


  在实际使用中,一般会在存储器中分配一些空间作为堆栈,由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复寄存器的内容,采用这种方式可以保证异常发生后程序的正常执行。


  R14也称作子程序连接寄存器(subroutine link register)或连接寄存器LR,当执行分支指令BL时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。类似地,当发生中断或异常时,或当程序执行BL指令时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15(PC)的返回值。


  寄存器R14常用在如下的情况:在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将子程序的返回地址(在PC中)复制给R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。典型的做法如下:

●执行以下任意一条指令:
MOV PC,LR ;R14复制到PC,实现子程序的返回
BX LR ;跳到LR指的地址处执行程序,实现子程序的返回
●在子程序入口处使用以下指令将R14存入堆栈:
STMFD SP!,{,LR}
对应的,使用以下指令可以完成子程序返回:
LDMFD SP!,{,PC}

图2.4是这种方法的一个实现。

(3)程序计数器PC(R15)

  寄存器R15用作程序计数器PC(program counter)。在ARM状态下,所有指令都是32位宽,所有的指令必须字对齐,所以PC的值由位[31:2]决定,位[1:0]是0(在Thumb状态下,必须半字对齐,位[0]为0,PC的值由位[31:1] 决定)。R15虽然也可用作通用寄存器,但一般不这么使用,因为R15的值通常是下一条要取出的指令的地址,因此使用时有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。


  由于ARM7采用了三级流水线技术,指令读出的PC值是指令地址值加8个字节。


2. 程序状态寄存器

  ARM的程序状态寄存器PSR(program status register)有1个当前程序状态寄存器CPSR和5个备份的程序状态寄存器SPSR。CPSR用来标识(或设置)当前运算的结果、中断使能设置、处理器状态、当前运行模式等。而SPSR则是当异常发生时,用来保存CPSR当前值,以便从异常退出时用SPSR来恢复CPSR。处理器在所有工作模式下都可访问CPSR,不同模式的CPSR是同一个物理寄存器。而每一种异常模式下都有一个SPSR,它们对应不同的物理寄存器。由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。CPSR、SPSR都是32位寄存器,它们的格式是相同的,如图2.5所示。

(1)条件标志位 N、Z、C、V

  N、Z、C、V(negative、zero、carry、overflow)位称为条件码标志(condition code flags),经常以标志引用,它们的内容可被算术或逻辑运算的结果改变,ARM指令可以根据这些条件标志,选择性地执行后续指令(条件执行),条件码标志各位的具体含义如表2.2所示。

(2)Q标志位

  在ARMv5及以上版本的E系列处理器中,CPSR中的Q标志位指示增强的DSP运算指令是否发生了溢出。SPSR中的标志位Q用于当异常出现时保留和恢复CPSR中的Q标志。在其他版本的处理器中,Q标志位未定义。


(3)控制位

  PSR的低8位I、F、T和M[4:0]统称为控制位,当发生异常时这些位发生变化,如果处理器运行于特权模式下,这些位也可以由软件修改。


I和F位是中断禁止位:I置1则禁止IRQ中断,F置1则禁止FIQ中断。

  T位反映了处理器的运行状态,对不同版本的ARM处理器,T位含义不同。

  对于ARM体系结构v3以及更低的版本和v4的非T系列版本处理器,T位应当为0。在这些版本中,没有ARM和Thumb状态之间的切换。

  对于ARM体系结构v4及以上版本的T系列处理器,T的含义为:T=0表示执行ARM指令,T=1表示执行Thumb指令。

  在这些结构体系中,可以自由地使用能在ARM和Thumb状态之间切换的指令。

  对于ARM体系结构v5及以上版本的非T系列处理器,T的含义为:T=0表示执行ARM 指令,T=1表示强制下一条执行的指令产生未定义指令异常。

  M[4:0](M0、M1、M2、M3、M4)是模式位,这些位决定处理器的工作模式,具体含义如表2.3所示。

M[4:0]其他的组合结果会导致处理器进入一个不可恢复的状态。


(4)其他位

  PSR中的其余位为保留位,保留位将用于ARM版本的扩展。应用软件不要操作这些位,以免与ARM将来版本的扩展冲突。

推荐阅读

史海拾趣

Electronicon Kondensatoren GmbH公司的发展小趣事

ELECTRONICON Kondensatoren GmbH,其前身为RFT Kondensatorenwerk Gera,于20世纪30年代末与德国图林根东部的Gera的电容器制造商建立了紧密的合作。自此,ELECTRONICON开始崭露头角,专注于电容器技术的研发与生产。公司始终将产品的质量和可靠性作为核心理念,为未来的发展奠定了坚实的基础。

Corning Cable Systems公司的发展小趣事

在深海光缆领域,Corning Cable Systems公司也展现出了强大的实力。公司成功研发出适用于深海环境的光缆产品,并在多个国际项目中得到了广泛应用。这些深海光缆不仅具有优异的传输性能,还能够在极端恶劣的海底环境下保持长期稳定运行,为跨洋通信提供了可靠的保障。

Elpida Memory公司的发展小趣事

Elpida Memory的成立,标志着日本在DRAM(动态随机存取存储器)领域的一次重要整合。1999年,为了应对全球半导体市场的激烈竞争,日本政府主导了日立、NEC、三菱电机等公司的DRAM业务整合,成立了Elpida Memory。这一举措旨在保护日本在DRAM领域的市场份额和技术优势,同时也为Elpida Memory的未来发展奠定了坚实的基础。

GD Rectifiers Ltd公司的发展小趣事

随着全球对环境保护问题的日益关注,GD Rectifiers Ltd积极响应并践行绿色环保理念。公司投入大量资源进行绿色产品的研发和生产,推出了一系列符合环保标准的整流器产品。这些产品不仅具有高效、节能的特点,还大幅降低了生产和使用过程中的环境污染。同时,公司还加强了对废弃物的处理和回收利用工作,努力实现生产全过程的绿色化。GD Rectifiers Ltd的环保行动赢得了社会各界的广泛赞誉和支持,为公司的可持续发展奠定了坚实基础。

Fabrimex AG公司的发展小趣事

1995年,Fabrimex GmbH成立,作为电子组装和电源生产的生产公司。这一举措标志着公司进一步向国际化发展迈进。通过设立生产公司,Fabrimex AG能够更好地控制产品质量和生产成本,提高市场竞争力。同时,公司还加强了在全球范围内的销售活动,进一步扩大了市场份额。

全鹏(CHAMPION)公司的发展小趣事

在2003年,全鹏公司成为巴西Coletek集团的一员,开始了其在南美洲市场的征程。起初,全鹏在巴西设立了提供系统组装所需机壳、键盘、鼠标、喇叭等配件的组装工厂,以满足当地市场的初步需求。随着业务的不断扩大,全鹏在2004年与当地市政府合作,规划并建设了一座总厂房面积达8000平方公尺的新工厂,配置了六条组装生产线和两条印刷生产线,以及一个发货仓库。这座新工厂迅速成为全鹏在巴西市场的发货中心,推动了全鹏在当地的业务增长。

问答坊 | AI 解惑

一点建议

怎么上传不了很大的文件啊,比如视频啊几个G的,有什么办法改进没有啊…

查看全部问答>

AVR定时器的要点介绍

AVR定时器的要点介绍…

查看全部问答>

消费电子产品地域差异性日趋明显

前不久见到一位欧洲的朋友,偶然知道他随身携带一部便携式笔记本,由于无线网络问题在中国没有用武之地,听朋友介绍在无线网络相对发达的欧洲,这种便携式笔记本还是很受欢迎的。         同样的情况反映在智能手 ...…

查看全部问答>

招聘 Win CE软件开发工程师(北京)

主要开发WinCE下类 iPhone(Mutli-touch)技术的输入法    要求如下:   1. 熟悉windows ce或者Symbian下的编程,或熟练掌握 Windows API 编程,3年以上工作经验也可;   2. 精通C/C++语言;   3. 对U ...…

查看全部问答>

做过嵌入式,想做无线该怎么开始?

做了一年半的嵌入式,都是在别人基础上加功能,改UI,改驱动 想做无线方面,不知道怎么入手 希望高手指点…

查看全部问答>

请问如何更改WINCE 内核的按键音?

现在的按键音是生成内核时就有的,想改一个别的声音,请问该怎么改啊? 这个声音文件隐藏在哪里、有更改过这个按键音文件的朋友吗?…

查看全部问答>

Clock jitter analyzed in the time domain Part 1

本帖最后由 dontium 于 2015-1-23 13:39 编辑 IntroductionNewer high-speed ADCs e outfittedwith a large analog-input bandwidth (aboutthree to six times the maximum samplingfrequency) so they can be used in undersamplingapplications. ...…

查看全部问答>

给大家提个醒

用万利的演示板EK-STM3210E,编译器为MDK的, 最好不要用板的仿真器ST LINK II,一大堆莫名其妙的死机烦死人。 很多都死在HardFault_Handler(void)里,就是加一些没有调用的死代码也死, 编译时无任何错误提示。 换了一个山寨版的J-LINK, ...…

查看全部问答>

24c64连续读写子程序,其他部分在精华里!

void Read24C64(unsigned int ADDR,unsigned char *s,unsigned char no) { // uchar ddata=0; unsigned char ADDR_L,ADDR_H,i; ADDR_L=ADDR%256; ADDR_H=ADDR/256; IIC_START (); IIC_TX_DATA (0xA0); delay(50); IIC_TX_DATA (ADDR_H) ...…

查看全部问答>

大家帮忙看看我用中断实现的LED闪烁,但是为什么不行呢?

int main(void){         // disable JTAG port    DDPCONbits.JTAGEN = 0; //T2 interrupt initialization   SEI();//打开总中断    IFS0bits.T2IF=0;//清零中断标志位& ...…

查看全部问答>