分享

3.2 特殊功能寄存器组

 戴维图书馆 2017-01-04

《Cortex-M3 权威指南》,嵌入式处理器开发教程。

Cortex-M3 中的特殊功能寄存器包括:

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

中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及 BASEPRI)

控制寄存器(CONTROL)

它们只能被专用的MSR/MRS 指令访问,而且它们也没有与之相关联的访问地址。

MRS <gp_reg>, <special_reg> ;读特殊功能寄存器的值到通用寄存器

MSR <special_reg>, <gp_reg> ;写通用寄存器的值到特殊功能寄存器

3.2.1 程序状态寄存器(PSRs或曰 PSR)

程序状态寄存器在其内部又被分为三个子状态寄存器:

应用程序 PSR(APSR)

中断号 PSR(IPSR)

执行 PSR(EPSR)

通过 MRS/MSR 指令,这 3 个 PSRs 即可以单独访问,也可以组合访问(2 个组合,3 个组合都 可以)。当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”。

图 3.3 Cortex-M3 中的程序状态寄存器(xPSR)

图 3.4 合体后的程序状态寄存器(xPSR)

3.2.2 PRIMASK, FAULTMASK和 BASEPRI

这三个寄存器用于控制异常的使能和除能。
表 3.2 Cortex-M3 的屏蔽寄存器组

名字

功能描述

PRIMASK

这是个只有单一比特的寄存器。在它被置 1 后,就关掉所有可屏蔽的异常,只剩

下NMI 和硬fault 可以响应。它的缺省值是0,表示没有关中断。

FAULTMASK

这是个只有1 个位的寄存器。当它置1 时,只有NMI 才能响应,所有其它的异常,

甚至是硬fault,也通通闭嘴。它的缺省值也是0,表示没有关异常。

BASEPRI

这个寄存器最多有9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈

值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号 越大,优先级越低)。但若被设成0,则不关闭任何中断,0 也是缺省值。

对于时间-关键任务而言,恰如其分地使用 PRIMASK 和BASEPRI 来暂时关闭一些中断是非常重要
的。而FAULTMASK 则可以被OS 用于暂时关闭fault 处理机能,这种处理在某个任务崩溃时可能需要。 因为在任务崩溃时,常常伴随着一大堆 faults。在系统料理“后事”时,通常不再需要响应这些 fault
——人死帐清。总之FAULTMASK 就是专门留给 OS 用的。
要访问 PRIMASK, FAULTMASK 以及BASEPRI,同样要使用 MRS/MSR 指令,如:

MRS

R0,

BASEPRI

;读取BASEPRI到R0中

MRS

R0,

FAULTMASK

;似上

MRS

R0,

PRIMASK

;似上

MSR MSR MSR

BASEPRI, R0

FAULTMASK, R0

PRIMASK, R0

;写入R0到BASEPRI中

;似上

;似上


只有在特权级下,才允许访问这 3 个寄存器。

译者添加:

其实,为了快速地开关中断,CM3还专门设置了一条CPS指令,有4种用法

CPSID

I

;PRIMASK=1,

;关中断

CPSIE

I

;PRIMASK=0,

;开中断

CPSID CPSIE

F F

;FAULTMASK=1,

;FAULTMASK=0

;关异常

;开异常

3.2.3 控制寄存器(CONTROL)

控制寄存器有两个用途,其一用于定义特权级别,其二用于选择当前使用哪个堆栈指针。由两个比 特来行使这两个职能。
表 3.3 Cortex-M3 的 CONTROL 寄存器

功能

CONTROL[1]

堆栈指针选择

0=选择主堆栈指针MSP(复位后的缺省值)

1=选择进程堆栈指针 PSP

在线程或基础级(没有在响应异常——译注),可以使用PSP。在handler 模式下, 只允许使用MSP,所以此时不得往该位写1。

CONTROL[0]

0=特权级的线程模式

1=用户级的线程模式

Handler 模式永远都是特权级的。

CONTROL[1]

在 Cortex-M3 的 handler 模式中,CONTROL[1]总是 0。在线程模式中则可以为 0 或 1。
因此,仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处理器的模 式也有其它的方式:在异常返回时,通过修改 LR 的位 2,也能实现模式切换。这是 LR 在异常返回 时的特殊用法,颠覆了对 LR 的传统使用方式,将在第 5 章中展开论述。

CONTROL[0]

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

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

MRS

R0,

CONTROL

MSR

CONTROL,

R0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多