GD32 bootloader跳转app遇到的坑

最近在调试GD32F4的bootloader程序发现了个奇怪的问题,之前在自己电脑上开发完成并测试没问题后,就提交了代码,但是同事拉取后编译出来的bootloader在跳转到app的时候会直接卡死,对比了一下他编译出来的bin和我这边的bin,同一份代码,同一个project编译出来的bin居然也有挺大差别的
在这里插入图片描述

首先还是猜测是编译器优化的问题,但他的和我的都是-O1,不过我还是试了下在自己电脑上改成-O0编译了bootloader,下载到板子里发现跳转时居然也卡住了。。。。。在这里插入图片描述
串口打了个斜杠0就没下文了。。。。

跳转的函数是这样的
在这里插入图片描述

好吧,就只能去分析下这个-O1和-O0生成的bin有啥区别了
通过debug到这个函数,发现生成的汇编代码还是有挺大差别的,具体来说-O1的基本都是在用通用寄存器在操作数据
在这里插入图片描述
而-O0生成的就会用到栈指针来存取数据
在这里插入图片描述
其实分析到这里就挺明显的了,在-O0时,由于最后一步跳转时读取了sp+4里面的数据,但是在这之前sp的地址因设置了MSP而被手动改成了app的栈指针地址,所以它读出来的东西就已经不是之前保存起来的需要跳转的地址了,跳过去之后就会导致程序跑飞

最后,把__set_MSP给删掉后,在-O0的情况下也能正常跳转了
这里也有点奇怪,不重新设置栈指针居然也能跳转成功。。。(按正常流程应该要设的吧),而且看了下跳转后app的栈指针的确也是app的bin文件里指定的栈顶指针,并不是bootloader的栈顶指针,猜测可能在执行Reset_Handler到main函数之间会再次设置栈顶地址,毕竟在__main中会设置堆栈(不确定,望大佬指教)

因为之前出现了同样是-O1选项的两台电脑编译,生成的固件是不一样的,所以后面就在自己的电脑上不断切换-O1和-O0来编译做测试,一开始-O1生成的bin大小是8K左右,-O0生成的bin是14K左右,试了几次后,就发现-O1生成的bin变成了11k大小。。。虽说应该影响不大,但还是给自己提个醒,出问题时可以留意有没有可能是这个导致的

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GD32 Bootloader App合成是指将GD32芯片的引导程序和应用程序合并在一起,以实现在同一个芯片上同时运行引导程序和应用程序的功能。 合成Bootloader App的目的是为了方便固件的加载和更新。引导程序是在启动时首先运行的程序,其作用是加载和启动应用程序。应用程序则为实际需要运行的程序。 合成Bootloader App的步骤如下: 1. 编写引导程序代码,负责加载和启动应用程序。引导程序通常位于芯片的起始地址。 2. 编写应用程序代码,并确定其入口点。应用程序可以是任何需要运行的功能,例如操作系统、用户界面等。 3. 将应用程序的代码与引导程序的代码合并在一起,生成合成后的固件。 4. 将合成后的固件下载到GD32芯片中。 合成完成后,GD32芯片将在启动时首先运行引导程序,引导程序会负责加载和启动应用程序。这样就可以在同一个芯片上同时运行引导程序和应用程序。 通过合成GD32 Bootloader App,可以方便地进行固件的更新,只需将新的应用程序代码与引导程序代码合并,然后下载到芯片中即可。同时,由于引导程序独立于应用程序,可以大大提高系统的稳定性和可靠性。 总之,GD32 Bootloader App合成是将引导程序和应用程序合并在一起,以实现在同一个芯片上同时运行引导程序和应用程序的功能,方便固件的加载和更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值