0 前言
在进行Cortex‐M3/M4/M7内核MCU的RTOS开发过程中,我们经常会经常进行“线程切换”这个操作,与“线程切换”紧密结合的就是内核寄存器R0-R15和特殊功能寄存器,本文将详细介绍Cortex‐M3/M4/M7内核寄存器R0-R15和特殊功能寄存器,为学习和使用RTOS打下基础。
1 Cortex‐M3/M4/M7内核寄存器组介绍
1.1 R0-R15寄存器总览
Cortex‐M3/M4/M7内核均拥有R0-R15这16个寄存器。
(1)R0-R12:通用寄存器
(2)R13:堆栈指针,它包含2个堆栈指针,一个是主堆栈指针(MSP),一个是进程堆栈指针(PSP)。在同一时刻对外表现为主堆栈指针或进程堆栈指针,只有一个能够看到,也就是所谓的“banked”寄存器。
(3)R14:链接寄存器(LR)
(4)R15:程序计数器(PC)
R0-R15的寄存器组可以用下面的图片表示:
1.2 R0-R12通用寄存器
R0-R12寄存器大小均为32位,用来实现最通用的数据操作,例如作为中间变量给目标变量赋值。其中R0-R7又被称为低组寄存器,而R8-R12又被称为高组寄存器。
其中R0-R7能够被绝大多数的16位 Thumb 指令访问,而32位的Thumb‐2指令可以访问所有通用寄存器。
1.3 R13堆栈指针寄存器
为了支持操作系统,Cortex‐M3/M4/M7内核拥有2个堆栈指针,然而任意时刻对外表现都是其中的1个,这样的寄存器又被称为“banked”寄存器。R13堆栈指针寄存包含以下2个堆栈指针:
(1)主堆栈指针(MSP):MCU复位以后默认使用的堆栈指针,用于操作系统内核及异常(包含中断)处理例程。
(2)进程堆栈指针(PSP):由用户的应用程序代码使用。
注:
堆栈指针的低2位永远是0,因此能够保证堆栈指针永远是4字节对齐的。堆栈指针永远指向栈顶
1.4 R14链接寄存器(LR)
R14链接寄存器作用有以下2个方面:
(1)当我们调用其它函数时,R14链接寄存器被设置为函数返回地址
(2)发生异常或中断时,R14链接寄存器被设置为需要返回的地址
1.5 R15程序计数器(PC)
该寄存器的值永远是下一个执行的指令的地址。如果修改PC的值就能改变程序执行的顺序,实现一些高级操作。
1.6 特殊功能寄存器
Cortex‐M3/M4/M7内核除了R0-R15之外还有若干特殊功能寄存器,包括程序状态字寄存器组(PSRS)、中断屏蔽寄存器组( PRIMASK, FAULTMASK, BASEPRI)、控制寄存器(CONTROL)。这些寄存器在RTOS的源码内经常可以看到,比如中断屏蔽寄存器组就常见于临界段的保护。