• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

关于STM32的堆栈问题!

奔跑的黑蚂蚁 2018-04-18 浏览量:2263

我在做STM32串口IAP实验室的时候看了正点原子的程序代码,在跳转的部分不太明白,为什么要这样检测   if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.

还有就是重新设置堆栈地址的时候,必须使用汇编才能重新设置堆栈地址吗???



//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.

jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}  

//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(u32 addr) 
{
    MSR MSP, r0 //set Main Stack value
    BX r14
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 栈顶地址是否合法,应该是前面有什么约定吧

    设置好栈指针,就可以进 c 程序了,你得 app 应该就是 c 代码了。

    底层就是这样操作栈指针的,可以看看芯片手册中的指令集部分,告诉你怎么操作栈指针,用什么指令,就是这些汇编。

    汇编已经是最低层了,人家怎么说怎么用,没啥商量的,不按照那么用也没有别的方法,这就是最官方的正式的用法了

    • 发布于 2018-04-19
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3
  • 设置栈就是操作寄存器级的东西,也就只有汇编能做到了,不过我感觉通过定义一个指针等于栈寄存器的地址,然后向这个地址写数来改变也是可以的,你可以试一试成不成功。
    • 发布于2018-04-18
    • 举报
    • 评论 0
    • 0
    • 0

  • 设置堆栈地址属于内核操作,必须用寄存器
    • 发布于2018-04-18
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个检查可能是代码约定、规范限制的吧。
    • 发布于2018-04-18
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

关于STM32的堆栈问题!