《ARM Cortex-M3与Cortex-M4权威指南》第四章笔记

 

4.2 编程模型

  1. OS内核与系统中断使用MSP(仅能在特权模式下访问),用户任务使用PSP
  2. CPU操作状态分为:调试状态(处于DEBUG断点)、THUMB状态(M系列处理器无ARM状态)。操作模式分为:处理模式(在中断ISR状态下)、线程模式(执行普通程序)
  3. 线程模式可以切换独立的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?又如碰到16THUMB指令时,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存储器系统

  1. 基本映射图

    2.  栈的用途可分为:调用函数时保存现场、函数或子程序参数传递,局部变量存储,中断时保存寄存器值。

    3.  在CORTEXM中,栈从高地址生长至低地址,PUSH操作先移动SP指针,再在SP的上一个数据框中存入数据。

    4.  对于使用OS的应用,如果发生了中断,则压栈的参数会存于PSP中,如下图所示

 

 4.5  异常与中断

1.0x00000000存放的是MSP初值,上电复位时,处理器会一次读取2个字的内容即MSP初始值和复位向量,之所以在复位时需要MSP是因为在复位过程中有可能会发生NMI或HARDFAULT,需要参数压栈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章