写下这篇文章的主要目的是对自己学习RTOS的历程做一个记录和总结,方便以后回忆翻看。以下内容主要来自宋岩先生翻译的《Cortex-M3权威指南》。
目录
一、Cortex-M3寄存器简介
Cortex‐M3 处理器拥有 R0‐R15 的寄存器组。R0‐R12都是32位通用寄存器,用于数据操作。R13-R15是专用寄存器。
R0-R3:用作传入函数参数,传出函数的返回值。在子程序运行时,可将R0-R3用于任何用途。被调用函数在返回之前不必恢复R0-R3,如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
R4-R11:被用来存放函数的局部变量。如果调用函数使用了这些寄存器,它在返回之前必须恢复寄存器的值。
R13是堆栈指针(SP),Cortex‐M3 拥有两个堆栈指针,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。需要注意的是堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。
- 主堆栈指针( MSP):复位后缺省使用的堆栈指针,用于操作系统内核、异常处理例程(包括中断服务例程)以及所有需要特权访问的应用程序来使用
- 进程堆栈指针( PSP):由用户的应用程序代码使用(不处于异常服务程序时)。
R14是链接寄存器(LR),当呼叫一个子程序时,由 R14 存储返回地址;例如,当你在使用 BL(分支并连接, Branch and Link)指令时,就自动填充 LR 的值。
main ;主程序
…
BL Task ; 使用“分支并连接”指令呼叫 Task,PC= Task,并且 LR=main 的下一条指令地址
…
Task
… ; Task 的代码
BX LR ; 函数返回(如果 Task再次调用其他函数要使用 LR,必须在使用前 PUSH,否则返回时LR的值被改变程序就可能跑飞了)
R15是程序计数器(PC)指向当前的程序地址。如果修改它的值,就能改变程序的执行流程。
Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址。这些寄存器包括:
- 程序状态寄存器组( PSRs 或xPSR)
- 中断屏蔽寄存器组( PRIMASK, FAULTMASK,以及 BASEPRI)
- 控制寄存器( CONTROL)
程序状态寄存器PSR在其内部又被分为三个子状态寄存器:应用程序 PSR( APSR)、中断号 PSR( IPSR)、执行 PSR( EPSR)。通过 MRS/MSR 指令,这 3 个 xPSR 即可以单独访问,也可以组合访问( 2 个组合, 3 个组合都可以)。当使用三合一的方式访问时,应使用名字“xPSR”或者“ PSR”,合体后的xPSR如下图所示。
PRIMASK, FAULTMASK 和 BASEPRI这三个寄存器用于控制异常(中断)的使能和除能。
控制寄存器(CONTROL)控制寄存器用于定义特权级别,还用于选择当前使用MSP还是PSP。