加载中…
个人资料
沙路无泥
沙路无泥
  • 博客等级:
  • 博客积分:0
  • 博客访问:7,960
  • 关注人气:14
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Cortex-M3双堆栈指针(MSPPSP)

(2023-02-14 17:26:09)
标签:

堆栈指针

msp

psp

it

分类: 资料收藏

【双堆栈指针(MSP&PSP)】

Cortex-M3内核中有两个堆栈指针(MSP & PSP),但任何时刻只能使用到其中一个。

复位后处于线程模式特权级,默认使用MSP

通过SP访问到的是正在使用的那个指针,可以通过MSR/MRS指令访问指定的堆栈指针。

通过设置CONTROL寄存器的bit[1]选择使用哪个堆栈指针。CONTROL[1]=0选择主堆栈指针;CONTROL[1]=1选择进程堆栈指针。

Handler模式下,只允许使用主堆栈指针MSP

【双堆栈指针在OS中的应用】
典型的OS环境中,MSPPSP的用法如下:

MSP用于OS内核和异常处理。

PSP用于应用任务。

Cortex-M3双堆栈指针(MSPPSP)

【双堆栈指针的初始化】

系统复位时从0x00000000处读出MSP的初始值。

OS初始化时,对PSP进行初始化。

Cortex-M3双堆栈指针(MSPPSP)

PSP指针在不同任务间切换】

用任务ASP执行入栈操作,并保存任务ASP

设置PSP指向任务B的栈空间,用任务BSP执行出栈,随后开始执行任务B

Cortex-M3双堆栈指针(MSPPSP)

 

所以内核是PSP还是MSP总结为:

1)不使用OS时: 只用到MSP(中断和非中断都使用MSP);
2
)使用OS时(如UCOSII): main函数和中断使用MSP; 各个Task(线程)使用PSP(即任务栈);

当带操作系统从APP区跳转到BOOT区的时候需要将SP设置为MSP,否则在BOOT区中使用中断将会引发硬件错误!

如果在APP中打开了看门狗那么当跳转到BOOT中时也需要定时喂狗,否则会触发看门狗超时复位!

******************************************************************************* 

appbootloader跳转 MSPPSP

1.不要把跳转函数放在中断中,如此导致在跳转后的app或者bootloder都是在中断状态,只要你一开启该中断,就可能出现硬件中断了。

2.如果你的APP使用了ucos系统,在跳转函数中还需要增加__set_CONTROL(0);//psp修改成msp;这样是为了把ucos系统中的psp置回msp,否则容易出现硬件中断。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有