《ARM Cortex-M3与Cortex-M4权威指南》第四章笔记
4.2 编程模型
- OS内核与系统中断使用MSP(仅能在特权模式下访问),用户任务使用PSP
- CPU操作状态分为:调试状态(处于DEBUG断点)、THUMB状态(M系列处理器无ARM状态)。操作模式分为:处理模式(在中断ISR状态下)、线程模式(执行普通程序)
- 线程模式可以切换独立的SP,处理器启动后处于特权线程模式以及THUMB状态,部分架构无非特权线程模式(如M0)
4. MSP与PSP均为32位,对于CORTEXM处理器,PUSH与POP均为32位操作,因此指针地址后2位为0
5. LR寄存器记录函数或子程序调用后的返回地址,若函数又调用了函数或子程序,为了保证LR值不丢失,需要将LR入栈;在 异常处理时LR会被更新为特殊的EXC_RETURN数值。典型的有如下3种值:
值 |
含义 |
0xFFFFFFF1 |
中断返回时从MSP恢复栈,返回之后操作模式为处理模式,使用MSP栈,即在中断嵌套情况下,返回上一级中断 |
0xFFFFFFF9 |
中断返回时从MSP恢复栈,返回之后操作模式为线程模式,使用MSP栈,该情况在只使用MSP不使用PSP时发生 |
0xFFFFFFFD |
中断返回时从PSP恢复栈,返回之后操作模式为线程模式,使用PSP栈,即一般的从中断返回用户线程的情况 |
由于处理器指令均为对齐至偶数地址,会出现LR寄存器最后1位没有用到的情况,设计者因此将LR寄存器的最后1位作为 THUMB状态的标志位,为1时为THUMB状态。
6. PC寄存器为程序计数器。若读取PC寄存器时返回的是当前指令地址加4的地址,(按书中所说指令需要对齐至半字或字地 址,即4字节或2字节对齐,这样的话PC为什么不是指令地址加2?又如碰到16位THUMB指令时,PC值又如何计算?)这 里需要注意处理器为三级流水线设计,即取指、译码、执行三级,当前指令取指完成后,PC即会进行PC=PC+4的操作, 当处理器处于执行某条指令的状态时,由于是三级流水线设计,此时PC的值为当前指令地址加8。
(摘自https://www.cnblogs.com/jack-hzm/p/11961878.html)
7. 特殊寄存器。
(1) 程序状态寄存器。包括:APSR EPSR IPSR。
(2) PRIMASK FAULTMASK BASEPRI寄存器
PRIMASK 阻止除NMI和HARDFAULT的其它中断
FAULTMASK 在PRIMASK基础上可屏蔽HARDFAULT中断,FAULTMASK在异常返回后会自动清除
BASEPRI 设定门限屏蔽优先级较低中断
(3) CONTROL寄存器
控制MSP与PSP、特权与非特权、浮点上下文活跃(具备FPU的M4)
8. 浮点寄存器
包含数据S0-S31或D0-D15、浮点状态和控制寄存器、经过存储器映射的浮点单元控制寄存器
4.4存储器系统
- 基本映射图
2. 栈的用途可分为:调用函数时保存现场、函数或子程序参数传递,局部变量存储,中断时保存寄存器值。
3. 在CORTEXM中,栈从高地址生长至低地址,PUSH操作先移动SP指针,再在SP的上一个数据框中存入数据。
4. 对于使用OS的应用,如果发生了中断,则压栈的参数会存于PSP中,如下图所示
4.5 异常与中断
1.0x00000000存放的是MSP初值,上电复位时,处理器会一次读取2个字的内容即MSP初始值和复位向量,之所以在复位时需要MSP是因为在复位过程中有可能会发生NMI或HARDFAULT,需要参数压栈。