0. 简介
Cortex‐M3 是一个32 位处理器内核。内部的数据路径是32 位的,寄存器是32 位的,存储器接口也是32 位的。CM3 采用了哈佛结构,拥有独立的指令总线和数据总线。指令总线和数据总线共享一个4GB的存储系统。
对于那些需要更多存储系统功能的复杂应用,Cortex‐M3处理器有一个可选配的MPU,如果需要还可以使用外部缓存cache。Cortex‐M3对于小端和大端存储系统都是支持的。
1. 寄存器组
Cortex‐M3 处理器拥有R0‐R15 的寄存器组。其中R13 作为堆栈指针SP。SP 有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。
1.1. R0-R12:通用寄存器
R0‐R12 都是32 位通用寄存器,用于数据操作。但是注意:绝大多数16 位Thumb 指令只能访问R0‐R7,而32 位Thumb‐2 指令可以访问所有寄存器。
1.2. R13:MSP/PSP堆栈指针
Cortex‐M3 拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
- 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
- 进程堆栈指针(PSP):由用户的应用程序代码使用。
堆栈指针的最低两位永远是0,这意味着堆栈总是4 字节对齐的。
在ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。
1.3. R14:连接寄存器LR
当呼叫一个子程序时,由R14 存储返回地址。
1.4. R15:程序计数器PC
指向当前的程序地址。如果修改它的值,就能改变程序的执行流。
1.5. 特殊功能寄存器
Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括:
- 程序状态字寄存器组(PSRs)
- 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)
- 控制寄存器(CONTROL)
寄存器及其功能:
寄存器 | 功能 |
---|---|
xPSR | 记录ALU 标志(0 标志,进位标志,负数标志,溢出标志),执行状态,以及当前正服务的中断号。 |
PRIMASK | 除能所有的中断,除了不可屏蔽中断(NMI)和 硬件故障(HardFault)。 |
FAULTMASK | 除能所有的中断,除了不可屏蔽中断(NMI)。而且被除能的faults会“上访”。 |