Cortex-M3体系结构概述
Cortex-M3内核
Cortex-M3内核是ARM公司开发的CPU内核,完整的MCU芯片集成了Cortex-M3内核以及其他组件。
- 32位RISC处理器
- 哈弗架构
- 3级流水线
- 内嵌中断向量控制器和SysTick定时器
主要特性
1. 工作模式及权限级别
工作模式分为 非异常状态(后台) 和 异常状态(前台),非异常状态即 线程模式 Thread mode, 异常状态即 处理者模式 Handler mode。
特权级别分为 用户级 和 特权级,Thread mode可以运行在用户级和特权级, 而Handler mode只能运行在特权级。
![image]2. 寄存器组
- 低组寄存器:R0~R7,通用寄存器
- 高组寄存器:R8~R12,通用寄存器
- 链接寄存器:LR(R14), 用于存储子程序调用的返回地址
- 程序计数器:PC(R15)
- 堆栈指针寄存器(R13):分为MSP和PSP,MSP为主堆栈指针(特权级),PSP为进程堆栈指针(用户级)。硬件会根据当前所处的特权级别自动切换MSP和PSP。
- 程序状态寄存器
31 | 30 | 29 | 28 | 27 | 26:25 | 24 | 23:20 | 19:16 | 15:10 | 9 | 8 | 7 | 6 | 5 | 4:0 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
xPSR | N | Z | C | V | Q | ICI/IT | T | ICI/IT | Exception Number | 同左 | 同左 | 同左 | 同左 |
- 异常屏蔽寄存器
- PRIMASK:只有一位,置1时会关闭所有可屏蔽的异常,只剩下NMI和硬fault可以响应。缺省值为0,表示没有关终端
- FAULTMASK:只有一位,置1时只有NMI才能响应,所有其它的异常,包括中断和fault都关闭。缺省值为0,表示没有关异常。
- BASEPRI:最多有9位,定义了被屏蔽优先级的阈值。当它被设为某个值后,所有优先级号大于等于此值的中断都将被关闭(优先级号越大,优先级越低)。若被设置为0,表示不关闭任何中断,缺省值为0。
- 控制寄存器(CONTROL):定义特权状态,并决定使用哪个堆栈指针。
3. 存储映射
- SRAM:片内RAM,用于存放堆栈、变量等数据
- Code:用于存放可执行代码及常量
4. 堆栈
Cortex-M3使用的是“向下生长的满栈”模型,采用双堆栈机制。
SP从高地址往低地址生长,SP指向最后一个被压栈的数据,当进行压栈操作时,SP先向下4字节,然后将数据压栈,出栈与之相反。5. 异常/中断处理
- 异常
编号0~15对应位系统异常,其中0号异常表示没有异常,优先级最高(-3),大于等于16的是外部中断,除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。 - 进入异常
- 硬件将xPSR,PC,LR,R12和R0~R3自动压入当前堆栈,其它寄存器根据需要由ISR自行保存
- 从中断向量表取出中断程序的入口地址
- SP:入栈后保存最后的堆栈地址
- PC:更新为中断服务入口地址
- LR:更新为特殊的EXC_RETURN值
- 执行异常/中断处理程序
- 退出异常
- 执行返回指令,如BX LR
- 恢复之前入栈的寄存器。出栈顺序与入栈时相对应, 栈指针的值也改回去。
- 从原中断发生的位置继续执行 在返回时,会根据EXC_RETURN值来决定返回动作
位段 | 含义 |
---|---|
[31:4] | EXC_RETURN的标识,必须全为1 |
3 | 0=返回后进入Handler模式;1=返回后进入线程模式 |
2 | 0=从主堆栈做出栈操作,返回后使用MSP;1=从进程堆栈做出栈操作,返回后使用PSP |
1 | 必须为0 |
0 | 0=返回ARM状态;1=返回Thumb状态;在CM3中必须为1 |
合法的EXC_RETURN值为0xFFFFFFF1:返回handler模式;0xFFFFFFF9:返回线程模式并使用主堆栈;0xFFFFFFFD:返回线程模式,并使用线程堆栈。
本文由作者按照 CC BY 4.0 进行授权