你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Keil4,子程序切换到psp,返回主调后仍用msp

[复制链接]
aTang 提问时间:2014-7-11 21:59 /
当前环境:windows xp,keil 4,Jlink, Stm32F103
1、我用汇编编写了一个子程序,用于切换堆栈指针,从msp切换到psp。
;void AsmInsTest (void)
                   export AsmInsTest
AsmInsTest         proc
                                   nop
                                   nop
                                   mrs   r0,control
                                   mov   r0,#0x02
                                   msr   control,r0
                                   dsb
                                   mrs   r0,control
                                   nop
                                   bx    lr
                   endp
2、,复位后(线程模式、超级权限、msp),调用上述的子程序,能够正确切换到psp。
        如下调用的:
                                  import AsmInsTest            ;经过测试,汇编程序A调用汇编程序B,B中修改control[1]选择psp后
                                  bl  AsmInsTest                   ;          返回A后,仍然选择的是psp
       且从子程序返回后,选择的仍然是psp,也就是control[1]中保存住了1。
3、问题出现,描述如下:
      A、注释掉2中的子程序调用语句,即,不使用汇编调用汇编的形式切换到psp了;
      B、从启动文件运行到C语言的main函数里面后,再C语言程序中调用1、中的汇编格式子程序;
      C、进入子程序内部,单步运行,可以看到确实切换到psp了。
  ***D、执行最后一条返回指令(bx lr)后,返回到main函数中。
问题出现了:一返回到main函数后,又开始使用msp了,而不是在子程序中设置的psp。
 
 
 
      哪位高手帮我解释下,这个原因? 是不是我在什么知识点上没注意到??

 
收藏 评论2 发布时间:2014-7-11 21:59

举报

2个回答
aTang 回答时间:2014-7-12 01:05:54

RE:Keil4,子程序切换到psp,返回主调后仍用msp

找到原因了。
int main (void)
    {
    unsigned char vSwt;
    ----;
    return 0;
    }
我在main函数中定义并使用了局部变量vSwt。
1、如果有这个局部变量,汇编语言写的访问特殊寄存器的指令(如mrs r0,primask)就不能正确执行。
2、如果main中不定义任何局部变量,只调用void xxx (void)型的函数,则不影响汇编语言程序。
3、被调用的void xxx (void)型函数,其内部再定义局部变量,就不影响汇编语言编写的程序了。
4、main函数调用其它有入口参数、返回值得函数,是否可以就没尝试了。
5、此问题,或者是我对某个知识点不清楚,或者是Keil4 mdk这个软件的问题。
巅峰残狼 回答时间:2014-7-16 19:57:15

RE:Keil4,子程序切换到psp,返回主调后仍用msp

学习了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版