garfield

【原创】ARM Cortex-M4寄存器及指令简介

0
阅读(16357)

飞思卡尔kinetis系列处理器是基于arm cortex-m4内核的高性能处理器。arm cortex m4处理器的寄存器有:R0-R15,如图所示,其中R13作为堆栈指针SP。SP实际上有两个,但在同一时刻只能由一个可以看到,这就是所谓的banked模式。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。

image

1通用寄存器R0-R12

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

2 堆栈指针R13

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

    主堆栈指针(msp),或者写作sp_main,主堆栈指针是复位后缺省使用的堆栈指针,他由os内核,中断服务程序以及所有需要特权访问的应用程序代码来使用。

    进程中断指针(psp),或写作sp_process,用于常规的应用程序代码,该堆栈一般供用户的应用程序代码使用。

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

3 连接寄存器R14(LR)

当调用一个子程序时,由R14存储返回地址,不像大多数其他处理器,arm为了减少访问内存的次数,从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。在arm编程时,应尽量只使用寄存器保存中间结果,在RISC处理器中,为了强调访问操作越过了处理器的界限,并且带来了对性能的不利影响,给它取了一个专业的术语--溅出。

4.程序计数寄存器R15

R15是程序计数器,指向当前的程序地址。如果修改它的值,就能改变程序的执行流。在汇编代码中也可以使用pc来访问它。因为arm cortex m4内部使用了指令流水线,读pc时返回的值是当前指令的地址+4.然而,在分支时,无论是直接写pc的值还是使用分支指令,都必须保证加载到pc的数值是奇数,用以表明这是在thumb状态下执行。倘若写了0,则视为企图转为arm模式,arm cortex m4将产生一个异常。

5特殊功能寄存器

arm cortex m4 还在内核水平上搭载了若干特殊功能寄存器,包括程序状态字寄存器组(psr或者xpsr)中断屏蔽寄存器组和控制寄存器,他们只能由专用的msr和mrs指令访问,而且他们也没有存储器地址。

1)程序状态寄存器

程序状态寄存器在其内部又被分成三个子状态寄存器:应用程序PSR,中断号PSR,执行PSR。通过MRS和MSR指令,这三个PSR既可以单独访问,也可以组合访问。

image

2)中断寄存器

这三个寄存器用于控制异常的使能和禁用。只有在特权级下,才允许访问这3个寄存器。对于时间关键任务来说,PRIMASK和BASEPRI对于暂时关闭中断是非常重要的。而fault-mask则可以被操作系统用于暂时关闭错误处理机能,这种处理在某个任务崩溃时可能需要。因为在任务崩溃时,常常伴随着大量的错误。在系统处理这些事物时,通常不再需要响应这些错误。总之FAULTMASK是专门留给操作系统用的。

image

3)控制寄存器

控制寄存器用于定义特权级别,主要用于选择当前使用哪个堆栈指针,

image