【嵌入式操作系统-2】Cortex-M7处理器编程者模型

文章目录

  • Cortex-M7内核外设
  • Cortex-M7处理器编程者模型
    • 软件运行时的处理器模式和特权级
      • 两种处理器模式:
        • 线程模式
        • Handler模式
      • 软件运行时的两种特权等级:
        • 非特权级:
        • 特权级:
    • 处理器寄存器
      • 栈指针
      • 链接寄存器
      • 程序计数器
      • 程序状态寄存器
      • 应用程序状态寄存器
      • 中断程序状态寄存器
      • 运行程序状态寄存器
      • 异常屏蔽寄存器
      • 优先级屏蔽寄存器
      • 故障屏蔽寄存器
      • 基本优先级屏蔽寄存器
      • 控制寄存器

Cortex-M7内核外设

【嵌入式操作系统-2】Cortex-M7处理器编程者模型
寄存器 读写属性 特权/非特权访问 复位后的值 描述
R0-R12 RW 均可以 未知 32位的通用寄存器
MSP RW 均可以 复位后从地址0x00000000加载MSP的初始值
(引导程序的中断向量表从0x00000000开始,前四个字节为sp初值)
主栈指针
PSP RW 均可以 0x00000000 主栈指针
LR RW 均可以 0xFFFFFFFF 链接寄存器
PC RW 均可以 复位后从地址0x00000004加载复位向量的值,该值的第0位会被加载到ESSR的T位,用于决定程序是否运行于Thumb状态 程序计数器
PSR RW 均可以 0x01000000 程序状态寄存器不是一个寄存器,它包含APSR,IPSR,EPSR
APSR RW 均可以 未知 应用程序状态寄存器
IPSPR RO 特权 0x00000000 中断程序状态寄存器
EPSR RO 特权 0x01000000 运行程序状态寄存器
PRIMASK RW 特权 0x00000000 优先级屏蔽寄存器
FAULTMASK RW 特权 0x00000000 故障屏蔽寄存器
BASEPRI RW 特权 0x00000000 基本优先级屏蔽寄存器
CONTROL RW 特权 0x00000000 控制寄存器

栈指针

在线程模式下,控制寄存器的bit[1]指示当前使用的是哪一个栈指针

  • 0 主栈(MSP)
  • 1 线程栈(PSP)

链接寄存器

存储了函数调用,异常处理的返回信息,复位后值为0xFFFFFFFF

程序计数器

包含当前指令的地址,复位后从0x00000004加载复位向量的值作为初值,该值的bit[0]会被加载到运行程序状态寄存器(EPSR)的T位,表明当前程序运行在Thumb状态还是其他状态。

程序状态寄存器

程序状态寄存器是APSR,EPSR,IPSR的组合,它们之间的位域相互独立,比特位的分布如下:

【嵌入式操作系统-2】Cortex-M7处理器编程者模型

应用程序状态寄存器

应用程序状态寄存器中的标识位表示了运行指令后的当前状态。

【嵌入式操作系统-2】Cortex-M7处理器编程者模型

运行程序状态寄存器

ICI域:

  • 当中断发生时程序正在执行STM,LDM,PUSH,POP指令,或者FPU正在运行VSTM,VLDM,VPUSH,VPOP时会暂停该指令,然后把下一个操作数放到ICI域中,当中断执行完成之后,从ICI域中恢复操作数,继续执行该指令。

Thumb 状态:

  • Cortex-M7只能在Thumb状态下运行指令,下面几种情况会把该位清零
    • BLX, BX, POP{PC}
    • 异常返回时从栈中恢复状态寄存器的值。
    • 一个中断向量的Bit[0]或者复位。
  • 当T位为0时运行指令会发生故障或者锁住。
    【嵌入式操作系统-2】Cortex-M7处理器编程者模型

    故障屏蔽寄存器

    它的第0位决定了是否屏蔽除了不可屏蔽中断(NMI)之外的其他中断,通过MSR指令在特权模式下可以访问。

    【嵌入式操作系统-2】Cortex-M7处理器编程者模型

    控制寄存器

    该寄存器控制着线程模式下程序运行时的特权等级和使用的栈,还可以指示当前是否处于FPU状态。

    【嵌入式操作系统-2】Cortex-M7处理器编程者模型
    • Handler模式下始终使用MSP,因此在Handler模式下处理器会忽略对SPSEL位的写入,异常的进入和返回机制会根据EXC_RETURN的值自动更新控制寄存器的值。
    • 在带操作系统的环境下,作者建议在线程模式下使用PSP,内核和异常处理使用MSP。
    • 默认情况下,线程模式下使用的是MSP,如果想切换成PSP:
      • 可以使用MSR指令修改SPSEL位为1
      • 执行一个异常处理然后使用一个适当的EXC_RETURN进行返回。
    • 当切换栈指针之后必须使用ISB指令刷新流水线,以保证在ISB之后执行的指令都使用新的栈。

    文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113095 人正在系统学习中

    来源:咕咚.萌西

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月25日
下一篇 2022年3月25日

相关推荐