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

2.2 Cortex-M0+处理器的寄存器

本节详细介绍Cortex-M0+处理器的寄存器,对其内部寄存器来说,其主要特点如下。

(1)它们用于保存和处理Cortex-M0+处理器核内暂时使用的数据。

(2)这些寄存器在Cortex-M0+处理器核内,因此处理器访问这些寄存器速度较快。

(3)采用加载-保存结构,即:如果需要处理保存在存储器中的数据,则需要将保存在存储器中的数据加载到一个寄存器中,然后在处理器内部进行处理。在处理完这些数据后,如果需要将其重新保存到存储器中,则将这些数据重新写回到存储器中。

对Cortex-M0+处理器的寄存器来说,包含寄存器组和特殊寄存器,如图2.5所示。下面对这些寄存器的功能进行详细介绍。

2.2.1 通用寄存器

在寄存器组中,提供了16个寄存器,这16个寄存器中的R0~R12寄存器可作为通用寄存器,其中:

(1)低寄存器,包括R0~R7寄存器,所有指令均可访问这些寄存器;

(2)高寄存器,包括R8~R12寄存器,一些Thumb指令不可以访问这些寄存器。

图2.5 Cortex-M0+处理器的寄存器

2.2.2 堆栈指针

寄存器组中的R13寄存器可以用作堆栈指针(Stack Pointer,SP),如图2.5所示。SP的主要功能如下。

(1)记录当前堆栈的地址。

(2)当在不同的任务之间切换时,SP可用于保存上下文(现场)。

(3)在Cortex-M0+处理器核中,将SP进一步细分为:

①主堆栈指针(Main Stack Pointer,MSP),在应用程序中,需要特权访问时会使用MSP,如访问操作系统内核、异常句柄;

②进程堆栈指针(Process Stack Pointer,PSP),当没有运行一个异常句柄时,该指针可用于基本层次的应用程序代码中。

注: (1)当复位时,处理器使用地址0x00000000中的值加载MSP。

(2)由CONTROL寄存器的bit[1]来控制SP是用作MSP还是PSP。

2.2.3 程序计数器

寄存器组中的R15寄存器可用作程序计数器(Program Counter,PC),其主要功能如下。

(1)用于记录当前指令代码的地址。

(2)除了执行分支指令外,在其他情况下,对32位指令代码来说,在进行每个操作时,PC递增4,即:

(PC)+4→(PC)

(3)对于分支指令(如函数调用),在将PC指向所指定地址的同时,将当前PC的值保存到链接寄存器(Link Register,LR)R14中。

Cortex-M0+处理器核的堆栈操作过程如图2.6所示。

图2.6 Cortex-M0+处理器核的堆栈操作过程

注: 复位时,处理器将地址为0x00000004的复位向量的值加载到PC。复位时,将该值的bit[0]加载到EPSR寄存器的T比特位中,并且该值必须为1。

2.2.4 链接寄存器

寄存器组中的R14寄存器可用作链接寄存器(Link Register,LR),其主要功能如下。

(1)该寄存器用于保存子程序、程序调用和异常的返回地址,如图2.7(a)所示。

(2)当程序调用结束后,Cortex-M0+将LR中的值加载到PC中,如图2.7(b)所示。

图2.7 程序调用和返回

注: 在复位时,LR的值未知。

2.2.5 程序状态寄存器

程序状态寄存器(x Program Status Register,xPSR),用于提供执行程序的信息,以及ALU的标志位。它包含三个寄存器。

(1)应用程序状态寄存器(Application Program Status Register,APSR);

(2)中断程序状态寄存器(Interrupt Program Status Register,IPSR);

(3)执行程序状态寄存器(Execution Program Status Register,EPSR)。

xPSR的位分配如图2.8所示。

图2.8 xPSR的位分配

注: 对这三个寄存器来说,它们可以作为一个寄存器xPSR来访问。比如,当发生中断时,xPSR会被自动压入堆栈;当从中断返回时,xPSR会自动恢复数据。在入栈和出栈时,将xPSR作为一个寄存器。

使用寄存器名字作为MSR或MRS指令的参数,既可以单独访问这些寄存器,也可以将任意两个或所有三个寄存器组合来访问这些寄存器(见表2.1)例如:

(1)在MRS指令中,使用PSR来读取所有寄存器;

(2)在MSR指令中,使用APSR来写入APSR。

表2.1 PSR寄存器的组合

①处理器忽略对IPSR位的写操作;

②读取EPSR的位将返回0,处理器忽略对这些位的写操作。

1.APSR

APSR寄存器内保存着ALU操作后所产生的标志位,这些标志位说明如下。

(1)[31]:N,符号标志。

①当ALU运算结果为负数时,将该位设置为1;

②当ALU运算结果为正数时,将该位设置为0。

(2)[30]:Z,零标志。

①当ALU运算结果等于0时,将该位设置为1;

②当ALU运算结果不等于0时,将该位设置为0。

(3)[29]:C,进位或借位标志。

当操作产生进位时,将该标志设置为1;否则,将该标志设置为0。在下面的情况下,产生进位标志,包括:

①如果相加的结果大于或等于2 32

②如果相减的结果为正或者零;

③作为移位或旋转指令的结果。

(4)[28]:V,溢出标志。

对于有符号加法和减法,如果有符号溢出,则将该位设置为1;否则,设置为0。例如:

①如果两个负数相加得到一个正数;

②如果两个正数相加得到一个负数;

③如果负数减去正数得到一个正数;

④如果正数减去负数得到一个负数。

注: 除了丢掉结果外,比较操作CMP和CMN分别与减法和加法操作相同。

(5)[27:0]:Reserved,保留。

在Cortex-M0+中,大部分数据处理指令都会更新APSR中的条件标志。有些指令更新所有标志,一些指令只更新其中的一些标志。如果没有更新标志,则保留最初的值。

程序开发者可以根据另一条指令中设置的条件标志来执行条件转移指令:

(1)在更新完标志的指令之后,立即执行;

(2)在没有更新标志的任意数量的中间指令之后进行。

2.IPSR

该寄存器保存当前中断服务程序(Interrupt Service Routine,ISR)的异常号。在Cortex-M0+中每个异常中断都有一个特定的中断编号,用于表示中断类型。在调试时,它对于识别当前中断非常有用,并且在多个中断共享一个中断处理的情况下,可以识别出其中一个中断。IPSR的位分配如图2.9所示。

图2.9 IPSR的位分配

3.EPSR

该寄存器只包含一个T比特位,用于表示Cortex-M0+处理器核是否处于Thumb状态。当应用软件尝试使用MRS指令直接读取EPSR时,总是返回0。当尝试使用MSR指令写入EPSR时,将忽略该操作。故障句柄可以检查堆栈PSR中的EPSR值,用于确定故障原因。以下方法可以将T比特位清零,包括:

(1)指令BLX、BX和POP{PC};

(2)在从异常返回时,从堆栈的xPSR值恢复;

(3)一个异常入口上向量值的bit[0]。

当T比特位为0时,尝试执行指令将导致硬件故障或锁定。

2.2.6 可中断重启指令

可中断重启指令是LDM、STM、PUSH、POP和MULS。当执行这些指令中的其中一条指令发生中断时,处理器将放弃执行该指令。当处理完中断后,处理器从头开始重新执行指令。

2.2.7 异常屏蔽寄存器

异常屏蔽寄存器禁止处理器对异常进行处理。禁止可能会影响时序关键任务或要求原子的代码序列的异常。

要禁止或重新使能异常,需要使用MSR和MRS指令或CPS指令来修改PRIMASK的值。

2.2.8 优先级屏蔽寄存器

优先级屏蔽寄存器(priority mask register,PRIMASK)的位分配如图2.10所示。

图2.10 PRIMASK的位分配

其中:

(1)[31:1]:Reserved(保留);

(2)[0]:PM,可优先排序的中断屏蔽。

①0=没有影响。

②1=阻止激活具有可配置优先级的所有异常。

2.2.9 控制寄存器

当处理器处于线程模式时,控制(CONTROL)寄存器控制使用的堆栈以及软件执行的特权级,其位分配如图2.11所示。

图2.11 CONTROL寄存器的位分配

其中:

(1)SPSEL位。

定义当前的堆栈。当该位为0时,MSP是当前的堆栈指针;当该位为1时,PSP是当前的堆栈指针。

注: 在句柄模式下,读取该位将返回0,忽略对该位的写操作。

(2)nPRIV位。

定义线程模式特权级。当该位为0时,为特权级;当该位为1时,为非特权级。

句柄模式始终使用MSP。因此,在句柄模式时,处理器将忽略对CONTROL寄存器活动堆栈指针位的显式写入操作。异常进入和返回机制会自动更新CONTROL寄存器。

在一个操作系统(Operating System,OS)环境中,建议以线程模式运行的线程使用线程堆栈,OS内核和异常句柄使用主堆栈。

线程模式默认使用MSP。要将线程模式下使用的堆栈指针切换到PSP,使用MSR指令将活动的指针位设置为1。

注: 当改变堆栈指针时,软件必须在MSR指令后立即使用ISB指令。这样可以确保ISB之后的指令使用新的堆栈指针执行。

思考与练习2.4:在Cortex-M0+处理器核中,通用寄存器的范围_____________。

思考与练习2.5:在Cortex-M0+处理器核中,实现堆栈指针功能的寄存器是_________。

思考与练习2.6:在Cortex-M0+处理器核中,所提供的堆栈指针的类型包括_______和________,它们各自实现的功能是______________和____________。

思考与练习2.7:在Cortex-M0+处理器核中,用作程序计数器的寄存器是___________,程序计数器所实现的功能是________________。

思考与练习2.8:在Cortex-M0+处理器核中,用作链接寄存器的寄存器是___________,链接寄存器的作用是____________________。

思考与练习2.9:在Cortex-M0+处理器核中,组合程序状态寄存器中所包含的寄存器是________、_________和_________,它们各自的作用分别是____________、___________和___________。

思考与练习2.10:在Cortex-M0+处理器核中,中断屏蔽寄存器所实现的功能是___________。

思考与练习2.11:在Cortex-M0+处理器核中,控制寄存器所实现的功能是____________。 9TJHyoPhEbodf5NWgDFn3j4iiHSRX3B5lFcD5h4ik5Ko4WFapQErcRmYxDSiakDk

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