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

2.2 编程模型

Cortex-M3处理器采用ARMv7 M架构。它包括所有的16位thumb指令集和基本的32位thumb-2指令集架构。Cortex-M3处理器不能执行ARM指令。

1.工作模式

Cortex-M3处理器支持两种工作模式:线程模式和处理模式。在复位时处理器进入线程模式,异常返回时也会进入该模式。特权和用户(非特权)代码能够在线程模式下运行。出现异常时处理器进入处理模式,在处理模式中,所有代码都是特权访问的。

2.工作状态

Cortex-M3处理器有两种工作状态:Thumb状态和调试状态。Thumb状态:是16位和32位半字对齐的Thumb和Thumb-2指令的正常执行状态。调试状态:处理器停机调试时进入该状态。

3.数据类型

Cortex-M3支持32位字、16位半字和8位字节等数据类型。存储器系统应该支持这些数据类型。尤其是要求在不破坏一个字中的相邻字节情况下支持小于1个字(subword)的写操作。

2.2.1 特权访问和用户访问

代码可以是特权执行或非特权执行。非特权执行时对有些资源的访问受到限制或不允许访问。特权执行可以访问所有资源。处理模式始终是特权访问,线程模式可以是特权或非特权访问。

线程模式在复位之后为特权访问,但可通过MSR指令清零CONTROL[0],将它配置为用户(非特权)访问。用户访问禁止部分指令的使用,例如,设置FAULTMASK和PRIMASK的CPS指令,禁止对系统控制空间(SCS)的大部分寄存器的访问。

当线程模式从特权访问变为用户访问后,本身不能回到特权访问。只有处理操作能够改变线程模式的访问特权。处理模式始终是特权访问的。

采用进程堆栈在“线程”模式下执行任务;采用主堆栈在“处理器”(Handler)模式下执行中断。在发生异常时,任务上下文会自动保存在进程堆栈上,此时处理器转入“处理器”模式,令主堆栈处于活动状态。从异常返回时,任务上下文得到恢复,继而恢复为“线程”模式。

这是假定在中断返回时被中断的任务仍为活动任务,但是,如果要安排一个新任务,则必须进行上下文切换。通过保存任务上下文,Cortex-M3硬件减少了上下文切换时间。软件必须只保存旧任务堆栈上的寄存器R4~R11,将R4~R11从新任务堆栈中弹出,调整堆栈指针和异常返回值,然后返回。这不仅比ARM7/9处理器所需步骤简单、直接得多,还可令消耗的处理器周期减少50%。

2.2.2 寄存器

Cortex-M3处理器包括13个通用寄存器(R0~R12)、分组的堆栈指针SP、链接寄存器R14、程序计数器R15和特殊用途程序状态寄存器xPSR。

1.通用寄存器

Cortex-M3拥有通用寄存器R0~R15。R0~R12是最“通用目的”的,但是绝大多数的16位指令只能使用R0~R7,而32位的Thumb-2指令则可以访问所有通用寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。

如图2.2所示为Cortex-M3寄存器。

图2.2 Cortex-M3寄存器

● 通用目的寄存器R0~R7

R0~R7也被称为低组寄存器,所有指令都能访问它们。它们的字长全部是32位,复位后的初始值是不可预料的。

● 通用目的寄存器R8~R12

R8~R12也被称为高组寄存器。这是因为只有很少的16位Thumb指令能访问它们,32位的指令则不受限制。它们也是32位字长,且复位后的初始值是不可预料的。

● 堆栈指针R13

寄存器R13用做堆栈指针(SP)。由于SP忽略了写入位[1:0]的值,因此它自动与字,即4字节边界对齐。处理模式始终使用SP_main,而线程模式可配置为SP_main或SP_process。

在Cortex-M3处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用R13(或写做SP)时,所引用到的是当前正在使用的一个,另一个必须用特殊的指令来访问(MRS、MSR指令)。这两个堆栈指针分别是:

主堆栈指针(MSP),或写做SP_main。这是默认的堆栈指针,它由OS内核、异常服务例程及所有需要特权访问的应用程序代码来使用。

进程堆栈指针(PSP),或写做SP_process。用于常规的应用程序代码(不处于异常服务例程中时)。

● 连接寄存器R14

R14是连接寄存器(LR)。在一个汇编程序中,可以把它写做both?LR和R14。LR用于在调用子程序时存储返回地址。例如,当使用BL(分支并连接,Branch?and?Link)指令时,就自动填充LR的值。

尽管PC的LSB总是0(因为代码至少是字对齐的),LR的LSB却是可读可写的。这是历史遗留的产物。在以前,由位0来指示ARM/Thumb状态。因为其他有些ARM处理器支持ARM和Thumb状态并存,为了方便汇编程序移植,Cortex-M3需要允许LSB可读可写。

● 程序计数器R15

R15是程序计数器,在汇编代码中也可以使用名字“PC”来访问。因为Cortex-M3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4。

2.特殊功能寄存器组

Cortex-M3中的特殊功能寄存器包括程序状态寄存器组(PSRs或xPSR)、中断屏蔽寄存器组(PRIMASK、FAULTMASK和BASEPRI)和控制寄存器。

● 程序状态寄存器组(PSRs或xPSR)

程序状态寄存器组在其内部又被分为三个子状态寄存器,分别是应用PSR(APSR)、中断PSR(IPSR)和执行PSR(EPSR)。在进入异常时,处理器将3个状态寄存器组合的信息保存在堆栈内。

通过MRS/MSR指令,这3个PSRs既可以单独访问,也可以组合访问(2个组合、3个组合都可以)。当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”。可以通过MRS指令读xPSR,通过MSR指令改变APSR。由于EPSR和IPSR只读,故不能改变内容。

3个寄存器组合访问时,可以通过MRS和MSR分别读、写:

xPSR位分配如图2.3所示,位定义如表2.1所示。

图2.3 程序状态寄存器(xPSR)位分配

表2.1 程序状态寄存器(xPSR)位定义

续表

应用PSR(APSR)包含条件代码标志。在进入异常之前,Cortex-M3处理器将标示条件代码。中断PSR(IPSR)包含当前激活的异常的ISR编号。执行PSR(EPSR)包含两个重叠的区域:

◆ 可中断—可继续(Interruptable-Continuable)指令(ICI)区,用于被打断的多寄存器加载和存储指令。可中断—可继续指令(ICI)区多寄存器加载(LDM)和存储(STM)操作是可中断的。EPSR的ICI区用来保存从产生中断的点继续执行多寄存器加载和存储操作时所必需的信息。

◆ 用于If-Then(IT)指令的执行状态区,以及T位(Thumb状态位)。EPSR的IT区包含了If-Then指令的执行状态位。

需要注意的是,ICI区和IT区是重叠的,因此,If-Then模块内的多寄存器加载或存储操作不具有可中断—可继续功能。

EPSR不能直接访问,若想修改EPSR,必须发生以下两个事件之一:

◆ 在执行LDM或STM指令时产生一次中断;

◆ 执行If-Then指令。

● 中断屏蔽寄存器组

PRIMASK是只有1个位的寄存器。当它置1时,就关掉所有可屏蔽的异常,只剩下NMI和硬fault可以响应。它的默认值是0,表示没有关中断。

FAULTMASK也是只有1个位的寄存器。当它置1时,只有NMI才能响应,所有其他的异常,包括中断和fault,通通“闭嘴”。它的默认值也是0,表示没有关异常。

BASEPRI寄存器最多有9位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关闭(优先级号越大,优先级越低)。但若被设置成0,则不关闭任何中断,0也是默认值。

可以通过MRS和MSR访问这3个寄存器:

● 控制寄存器(CONTROL)

控制寄存器用于定义特权级别和选择当前使用的堆栈指针,如表2.2所示。

表2.2 CONTROL寄存器

CONTROL[1]

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

CONTROL[0]

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

CONTROL寄存器也是通过MRS和MSR指令来操作的:

2.2.3 存储格式

Cortex-M3处理器将存储器看做从0开始向上编号的字节的线性集合。例如字节0~3存放第一个被保存的字,字节4~7存放第二个被保存的字。

Cortex-M3处理器能够以小端格式或大端格式访问存储器中的数据字,而访问代码时始终使用小端格式。小端格式是ARM处理器默认的存储器格式。在小端格式中,一个字中最低地址的字节为该字的最低有效字节,最高地址的字节为最高有效字节。存储器系统地址0的字节与数据线7~0相连。在大端格式中,一个字中最低地址的字节为该字的最高有效字节,而最高地址的字节为最低有效字节。存储器系统地址0的字节与数据线31~24相连。图2.4显示了小端格式和大端格式的区别。

图2.4 Cortex-M3小端格式和大端格式 RpEz3CAmOJ1m91THeb8cIKxcMh8YtEutXVLrFTIvMVJ2v5taqGFinVdLEVdE6X3u

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