搜索
bottom↓
回复: 10

关于cortex-m3 MSP PSP

[复制链接]

出0入0汤圆

发表于 2014-4-9 23:53:08 | 显示全部楼层 |阅读模式
在线程模式+PSP模式下发生SVC异常,这时进入异常时哪些寄存器压入哪个堆栈(PSP还是MSP),然后异常返回时从哪个堆栈弹出。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-4-10 09:20:01 | 显示全部楼层
异常(handler)模式下是MSP,《权威指南》上面有详细描述。

出0入0汤圆

发表于 2014-4-10 10:08:46 | 显示全部楼层
1,如果不是设置PSP的话,系统会一直使用MSP;
2,如果设置了PSP(比如使用了操作系统),你可以直观的认为,中断中就是用MSP,不中断时就是用PSP!

出0入0汤圆

 楼主| 发表于 2014-4-10 12:12:44 | 显示全部楼层
aozima 发表于 2014-4-10 09:20
异常(handler)模式下是MSP,《权威指南》上面有详细描述。

高手没明白我的意思啊。我问的是在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC,PSR,LR这些寄存器都被压进哪个堆栈了?是PSP还是MSP。然后我们进行正常的异常返回(BL LR)        ,这是出栈是从哪个堆栈出栈。
如果我们在异常返回时修改了EXC_RETURN,使返回后使用MSP,那么这时出栈操作从哪个堆栈进行。需不需要在异常里进行堆栈调整?

出0入0汤圆

 楼主| 发表于 2014-4-10 12:16:26 | 显示全部楼层
abbott 发表于 2014-4-10 10:08
1,如果不是设置PSP的话,系统会一直使用MSP;
2,如果设置了PSP(比如使用了操作系统),你可以直观的认为 ...

高手没明白我的意思啊。我问的是在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC,PSR,LR这些寄存器都被压进哪个堆栈了?是PSP还是MSP。然后我们进行正常的异常返回(BL LR)        ,这是出栈是从哪个堆栈出栈。
如果我们在异常返回时修改了EXC_RETURN,使返回后使用MSP,那么这时出栈操作从哪个堆栈进行。需不需要在异常里进行堆栈调整?

出0入0汤圆

发表于 2014-4-10 13:12:10 | 显示全部楼层
565715470 发表于 2014-4-10 12:16
高手没明白我的意思啊。我问的是在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC, ...

高手没明白我的意思啊。我问的是在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC,PSR,LR这些寄存器都被压进哪个堆栈了?是PSP还是MSP。然后我们进行正常的异常返回(BL LR)        ,这是出栈是从哪个堆栈出栈。
如果我们在异常返回时修改了EXC_RETURN,使返回后使用MSP,那么这时出栈操作从哪个堆栈进行。需不需要在异常里进行堆栈调整?

我的理解(对M3而言)
"在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC,PSR,LR这些寄存器都被压进哪个堆栈了?是PSP还是MSP"
1,这个过程是压入线程自己的堆栈(即PSP中),这样可以实现任务断点的保存;
如果我们在异常返回时修改了EXC_RETURN,使返回后使用MSP,那么这时出栈操作从哪个堆栈进行。需不需要在异常里进行堆栈调整?
2,handler处理中,需要将PSP堆栈指向新的任务,返回时也是PSP中出栈,这样出栈过程就实现任务跳转!
3,我刚刚软件仿真了一下,进入handler后,MSP指针的值没有改变,应该可以说明,从线程模式进入handler模式时压入的是PSP!


出0入0汤圆

发表于 2014-4-10 13:17:19 | 显示全部楼层
565715470 发表于 2014-4-10 12:16
高手没明白我的意思啊。我问的是在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC, ...

再补充一点儿:
来源于权威指南:“在进入ISR 时,CM3会自动把一些寄存器压栈,这里使用的是进入ISR 之前使用的SP指针(MSP或者是PSP)。离开ISR 后,只要ISR 没有更改过CONTROL[1],就依然使用先前的SP指针来执行出栈操作。”
在线程模式一般是使用PSP的!进入ISR那么就会使用线程模式的SP,即PSP!出栈也是一样的!

出0入0汤圆

发表于 2014-4-10 15:11:07 | 显示全部楼层
从线程模块进入handler模式,只有2个种途径:
1> 发生了异常(软件中断也是异常);
2> 调用了SVC服务(其实也属于第一种情况)。

在线程模式下,是不可能修改PSP或MSP的值的。MRS和MSR在线程模式下是非法指令,也能进入异常^_^.

出0入0汤圆

 楼主| 发表于 2014-4-10 15:11:26 来自手机 | 显示全部楼层
abbott 发表于 2014-4-10 13:12
高手没明白我的意思啊。我问的是在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC, ...

如果我们在异常返回时修改了EXC_RETURN,使返回后使用MSP,那么这时出栈操作从哪个堆栈进行。需不需要在异常里进行堆栈调整?

上面这个问题您又没明白我的意思

我的意思是在异常返回之前修改EXC_RETURN的第2位,使异常返回后使用MSP堆栈指针。这时出栈还会不会使用入栈时用的PSP?
高手帮我仿真一下吧,我刚开始学,没硬件。谢谢啦!!!

出0入0汤圆

 楼主| 发表于 2014-4-10 15:12:23 来自手机 | 显示全部楼层
abbott 发表于 2014-4-10 13:12
高手没明白我的意思啊。我问的是在线程模式并且用PSP指针时切换到handler模式,在这个过程R0--R3,R12,PC, ...

如果我们在异常返回时修改了EXC_RETURN,使返回后使用MSP,那么这时出栈操作从哪个堆栈进行。需不需要在异常里进行堆栈调整?

上面这个问题您又没明白我的意思

我的意思是在异常返回之前修改EXC_RETURN的第2位,使异常返回后使用MSP堆栈指针。这时出栈还会不会使用入栈时用的PSP?
高手帮我仿真一下吧,我刚开始学,没硬件。谢谢啦!!!

出0入0汤圆

发表于 2014-7-31 14:17:55 | 显示全部楼层
我理解下,楼主是否是中断前CONTROL[1]=1,使用PSP指针;然后想着在中断中将CONTROL[1]=0,呵呵,认为这样一搞,出去的时候就用MSP指针指向的对象出栈?

不是这样的,进行楼主所述的操作时,你会发现,在主程序或者任务中CONTROL[1]=1,使用PSP指针;当你运行至中断处理程序时,cortex-M3硬件会自动将CONTROL[1]=0,也就是选择主堆栈指针MSP。中断程序运行结束后,又切换回CONTROL[1]=1,使用PSP指针。

楼主想着在中断中改变CONTROL[1]的值的操作其实系统已经做了,做了以后,回去的路还是PSP。如果楼主是在很想,可以在中断中对PSP的值进行修改。

想通过这种方式改变离开中断时的SP指针是没有用的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 05:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表