《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
|
|