购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 ARM Cortex-M4 的寄存器及指令简介

本节将简要介绍ARM Cortex-M4 的寄存器及指令系统,网上光盘提供了指令系统的简明电子文档。

2.6.1 ARM Cortex-M4 的寄存器简介

ARM Cortex-M4 处理器的寄存器有:R0~R15,如图 2-11 所示。其中R13 作为堆栈指针SP。SP实质上有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。

图 2-11 ARM Cortex-M4 处理器的寄存器组

1.通用寄存器R0~R12

R0~R12 是最具“通用目的”的 32 位通用寄存器,用于数据操作。32 位的Thumb-2 指令则可以访问所有通用寄存器。但请注意:绝大多数 16 位Thumb指令只能访问R0~R7。因而R0~R7 又被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位,复位后的初始值是不可预料的。R8~R12 也被称为高组寄存器。这是因为只有很少的 16 位Thumb指令能访问它们,32 位的指令则不受限制。它们也是 32 位字长,且复位后的初始值是不可预料的。

2.堆栈指针R13

R13 是堆栈指针。在ARM Cortex-M4 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用R13(或写做SP)时,用户用到其中一个的话,另一个必须用特殊的指令来访问(MRS、MSR指令),因此任一时刻只能使用其中的一个。这两个堆栈指针分别为

● 主堆栈指针(MSP),或写做SP_main,主堆栈指针是复位后缺省使用的堆栈指针,它由OS内核、中断服务例程以及所有需要特权访问的应用程序代码来使用;

● 进程堆栈指针(PSP),或写做SP_process,用于常规的应用程序代码(不处于中断服务例程中时),该堆栈一般供用户的应用程序代码使用。

需要注意的是,并不是每个应用都用到这两个堆栈指针。简单的应用程序只用MSP就够了。堆栈指针用于访问堆栈,并且PUSH指令和POP指令默认使用SP。另外,堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常(Exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,或者不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。

3.连接寄存器R14(LR)

当调用一个子程序时,由R14 存储返回地址。不像大多数其他处理器,ARM为了减少访问内存的次数(访问内存的操作往往要 3 个以上指令周期,带MMU和Cache的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有 1 级子程序调用的代码无须访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于 1 级,则需要把前一级的R14 值压到堆栈里。在ARM上编程时,应尽量只使用寄存器保存中间结果。在RISC处理器中,为了强调访问操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语——溅出(Spill)。

4.程序计数寄存器R15

R15 是程序计数器,指向当前的程序地址。如果修改它的值,就能改变程序的执行流(很多高级技巧隐藏其中)。在汇编代码中也可以使用名字“PC”来访问它。因为ARM Cortex-M4 内部使用了指令流水线,读PC时返回的值是当前指令的地址+4。例如,“0x1000: MOV R0 ;PC R0=0x1004”,如果向PC中写数据,就会引起一次程序的分支(但是不更新LR寄存器)。ARM Cortex-M4 中的指令至少是半字对齐的,所以PC的LSB总是读回 0。然而,在分支时,无论是直接写PC的值还是使用分支指令,都必须保证加载到PC的数值是奇数(即LSB=1),用以表明这是在Thumb状态下执行。倘若写了 0,则视为企图转入ARM模式,ARM Cortex-M4 将产生一个异常。

5.特殊功能寄存器

图2-12 ARM Cortex-M4 中的特殊功能寄存器

ARM Cortex-M4 还在内核水平上搭载了若干特殊功能寄存器(如图 2-12 所示),包括程序状态字寄存器组(PSRs或xPSR)、中断屏蔽寄存器组(PRIMASK、FAULTMASK和BASEPRI)和控制寄存器(CONTROL),它们只能由专用的MSR和MRS指令访问,而且它们也没有存储器地址。

1)程序状态字寄存器(PSRs或xPSR)

程序状态字寄存器在其内部又被分为三个子状态寄存器(如图 2-13 和图 2-14 所示):应用程序PSR(APSR)、中断号PSR(IPSR)和执行PSR(EPSR)。通过MRS或MSR指令,这 3 个PSR既可以单独访问,也可以组合访问(2 个组合或 3 个组合都可以)。当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”。

2)中断寄存器(PRIMASK、FAULTMASK和BASEPRI)

这三个寄存器用于控制异常的使能和禁用。只有在特权级下,才允许访问这 3 个寄存器,如表 2-9 所示。

图 2-13 ARM Cortex-M4 中的程序状态寄存器(xPSR)

图 2-14 合成后的程序状态寄存器(xPSR)

表 2-9 ARM Cortex-M4 的屏蔽寄存器组

对于时间-关键任务而言,PRIMASK和BASEPRI对于暂时关闭中断是非常重要的。而FAULT MASK则可以被操作系统用于暂时关闭“错误”处理机能,这种处理在某个任务崩溃时可能需要。因为在任务崩溃时,常常伴随着大量的错误。在系统处理这些事物时,通常不再需要响应这些错误。总之FAULTMASK就是专门留给操作系统用的。

3)控制寄存器(CONTROL)

控制寄存器用于定义特权级别,主要用于选择当前使用哪个堆栈指针,如表 2-10 所示。

表 2-10 ARM Cortex-M4 的CONTROL寄存器

CONTROL[1]:在ARM Cortex-M4 的handler模式中,CONTROL[1]总是 0。在线程模式中则可以为 0 或 1。仅当处于特权级的线程模式下,此位才可写,其他场合下禁止写此位。改变处理器的模式也有其他的方式,如在异常返回时,通过修改LR的第 2 位,也能实现模式切换。

CONTROL[0]:仅当在特权级下才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,在服务例程中改写该位。

2.6.2 ARM Cortex-M4 的指令系统简介

ARM处理器一直支持两种形式上相对独立的指令集,即 32 位的ARM指令集(对应处理器的ARM状态)和 16 位的Thumb指令集(对应处理器的Thumb状态)。通常将ARM Cortex-M4指令集分为数据传送指令、数据处理指令、子程序调用及转移指令等。见网上光盘“..\WYH-K60BookA-CD(V1.0)\分章阅读资料\Ch02-DOC\ ARM Cortex-M4 指令列表.pdf”。 Q5akNC9yn9Nw2J2sCNV5mZkn+RMKMbQuybzzCE8lHfmTMH/t9DEUIZECXfC7Y0nv

点击中间区域
呼出菜单
上一章
目录
下一章
×