Cortex-M3中的寄存器组

1 Cortex-M3中的寄存器组

1.1 寄存器组

Cortex-M3中的寄存器组
(上图中说双堆栈寄存器R13基于特权级是错误的)。

这些寄存器中:

  • R15指明了当前任务执行的指令位置。
  • R13指明当前任务所用的堆栈位置。
  • R0~R3主要用于程序调用时,参数的传递;执行程序时局部变量的存储。

1.2 MSP和PSP

对于上图,除了简单了解其有R0~R15外,还要特别注意双堆栈寄存器R13,用于实现中断/异常所用的栈与任务所用的栈相分离,互不干扰。简单来说,一般在RTOS中,异常/中断发生时,硬件自动切换到MSP指向的堆栈来配合执行相应的处理程序,而退出后,自动切换到PSP指向的堆栈空间再执行任务代码(需要我们通过改变LR寄存器的值来完成)。

PSP和MSP重要知识:
对于一般的RTOS来说,当处理器复位之后,使用MSP。即main函数刚开始执行时使用MSP,当发生第一次任务切换后,任务就使用PSP,而异常处理程序依然使用MSP。如何从MSP切换到PSP,需要我们在异常处理程序中更改EXC_RETURN的值。

1.3 Cortex-M3中的堆栈

Cortex-M3使用的是向下生长的满栈模型,采用双堆栈机制。

每次压栈,堆栈地址递减。且堆栈指针SP(MSP/PSP)总是指向最后压栈的单元,不是下一个空闲的堆栈单元。这就是所谓的满栈。

压栈操作:
Cortex-M3中的寄存器组
出栈操作:
Cortex-M3中的寄存器组

1.4 程序状态寄存器

Cortex-M3中的寄存器组

1.5 异常屏蔽寄存器

Cortex-M3中的寄存器组


参考资料:

  1. 【李述铜】从0到1自己动手写嵌入式操作系统