本文主要是介绍Cortex-M3 双堆栈指针(MSP&PSP),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
参考:https://www.cnblogs.com/utank/p/11264175.html
【双堆栈指针(MSP&PSP)】
- Cortex-M3内核中有两个堆栈指针(MSP & PSP),但任何时刻只能使用到其中一个。
- 复位后处于线程模式特权级,默认使用MSP。
- 通过SP访问到的是正在使用的那个指针,可以通过MSR/MRS指令访问指定的堆栈指针。
- 通过设置CONTROL寄存器的bit[1]选择使用哪个堆栈指针。CONTROL[1]=0选择主堆栈指针;CONTROL[1]=1选择进程堆栈指针。
- Handler模式下,只允许使用主堆栈指针MSP。
【双堆栈指针在OS中的应用】
典型的OS环境中,MSP和PSP的用法如下:
- MSP用于OS内核和异常处理。
- PSP用于应用任务。
【双堆栈指针的初始化】
- 系统复位时从0x00000000处读出MSP的初始值。
- 在OS初始化时,对PSP进行初始化。
【PSP指针在不同任务间切换】
- 用任务A的SP执行入栈操作,并保存任务A的SP。
- 设置PSP指向任务B的栈空间,用任务B的SP执行出栈,随后开始执行任务B。
所以内核是PSP还是MSP总结为:
1)不使用OS时: 只用到MSP(中断和非中断都使用MSP);
2)使用OS时(如UCOSII): main函数和中断使用MSP; 各个Task(线程)使用PSP(即任务栈);
当带操作系统从APP区跳转到BOOT区的时候需要将SP设置为MSP,否则在BOOT区中使用中断将会引发硬件错误!
如果在APP中打开了看门狗那么当跳转到BOOT中时也需要定时喂狗,否则会触发看门狗超时复位!
这篇关于Cortex-M3 双堆栈指针(MSP&PSP)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!