新闻中心

EEPW首页>嵌入式系统>设计应用> ARM微处理器的编程模型之:ARM寄存器组织

ARM微处理器的编程模型之:ARM寄存器组织

作者: 时间:2013-09-13 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/257086.htm

1.未

包括r0~r7。顾名思义,在所有处理器模式下对于每一个未来说,指的都是同一个物理寄存器。未分组寄存器没有被系统用于特殊的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器。但由于其通用性,在异常中断所引起的处理器模式切换时,其使用的是相同的物理寄存器,所以也就很容易使寄存器中的数据被破坏。

2. 分组寄存器

r8~r14是分组寄存器,它们每一个访问的物理寄存器取决于当前的处理器模式。

对于这些分组寄存器r8~r12来说,每个寄存器对应两个不同的物理寄存器。一组用于除FIQ模式外的所有处理器模式,而另一组则专门用于FIQ模式。这样的结构设计有利于加快FIQ的处理速度。不同模式下寄存器的使用,要使用寄存器名后缀加以区分,例如,当使用FIQ模式下的寄存器时,寄存器r8和寄存器r9分别记做r8_fiq, r9_fiq;当使用用户模式下的寄存器时,寄存器r8和r9分别记做r8_usr, r9_usr等。在体系结构中,r8~r12没有任何指定的其他的用途,所以当FIQ中断到达时,不用保存这些通用寄存器,也就是说FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。所以FIQ模式常被用来处理一些时间紧急的任务,如DMA处理。

对于分组寄存器r13和r14来说,每个寄存器对应6个不同的物理寄存器。其中的一个是用户模式和系统模式公用的,而另外5个分别用于5种异常模式。访问时需要指定它们的模式。名字形式如下:

· r13_mode>

· r14_mode>

其中mode>可以是以下几种模式之一:usr、svc、abt、und、irp及fiq。

r13寄存器在中常用作堆栈指针,称为SP。当然,这只是一种习惯用法,并没有任何指令强制性的使用r13作为堆栈指针,用户完全可以使用其他寄存器作为堆栈指针。而在Thumb指令集中,有一些指令强制性的将r13作为堆栈指针,如堆栈操作指令。

每一种异常模式拥有自己的r13。异常处理程序负责初始化自己的r13,使其指向该异常模式专用的栈地址。在异常处理程序入口处,将用到的其他寄存器的值保存在堆栈中,返回时,重新将这些值加载到寄存器。通过这种保护程序现场的方法,异常不会破坏被其中断的程序现场。

寄存器r14又被称为(Link Register,LR),在体系结构中具有下面两种特殊的作用。

(1)每一种处理器模式用自己的r14存放当前子程序的返回地址。当通过BL或BLX指令调用子程序时,r14被设置成该子程序的返回地址。在子程序返回时,把r14的值复制到PC。典型的做法是使用下列两种方法之一。

· 执行下面任何一条指令。

MOV PC, LR

BX LR

· 在子程序入口处使用下面的指令将PC保存到堆栈中。

STMFD SP!, {register>,LR}

在子程序返回时,使用如下相应的配套指令返回。

LDMFD SP!, {register>,PC}

(2)当异常中断发生时,该异常模式特定的物理寄存器r14被设置成该异常模式的返回地址,对于有些模式r14的值可能与返回地址有一个常数的偏移量(如数据异常使用SUB PC, LR,#8返回)。具体的返回方式与上面的子程序返回方式基本相同,但使用的指令稍微有些不同,以保证当异常出现时正在执行的程序的状态被完整保存。

R14也可以被用作通用寄存器使用。

注意

当嵌套中断被允许时(即异常可重入),r13和r14的使用要特别小心。例如,在用户模式下一个IRQ中断发生,这时两种模式分别使用不同的r13和r14,换句话讲,用户模式使用r13_usr和r14_usr,而IRQ模式使用r13_irq和r14_irq,这样不会造成寄存器使用冲突。但是,当程序运行在IRQ模式下,又有IRQ中断进入,此时,第二级中断使用r13_irq和r14_irq,冲掉了第一级IRQ的堆栈指针和返回地址,导致程序异常。

解决办法是在第二级中断发生前,将第一级中断用到的寄存器压栈。

3.3.2r15

程序计算器r15又被记为PC。它有时可以被和r0-r14一样用作通用寄存器,但很多特殊的指令在使用r15时有些限制。当违反了这些指令的使用限制时,指令的执行结果是不可预知的。

在下面两种情况下用于特殊的目的。

· 读程序计数器。

· 写程序计数器。

尘埃粒子计数器相关文章:尘埃粒子计数器原理


评论


相关推荐

技术专区

关闭