呜呼噜噜 2023-02-23 17:58 采纳率: 72.7%
浏览 41

bootloader无法跳转问题

在gd32e230c上进行bootloader跳转到应用程序时,发现加入__set_MSP( * ( __IO uint32_t * ) App_Addr );这句初始堆栈地址时,就无法跳转了,去掉这句话就可以正常跳转到app,实在想不明白怎么回事。

void IAP_ExecuteApp (uint32_t App_Addr)
{
                uint32_t JumpAddress;
         usart_disable(USART0);

        JumpAddress = * ( __IO uint32_t * )(App_Addr + 4);//用户代码区第二个字为程序开始地址(复位地址)        
//        __set_MSP( * ( __IO uint32_t * ) App_Addr );    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
        (*( void (*)( ) )JumpAddress) ();                //跳转到APP.

}

  • 写回答

2条回答 默认 最新

  • grantthing 2023-02-23 18:13
    关注

    这里的问题可能与应用程序的堆栈初始化有关。

    在 ARM Cortex-M 架构中,应用程序启动时需要进行堆栈初始化。堆栈指针 MSP (Main Stack Pointer) 是一个指向堆栈顶部的寄存器,用于管理堆栈内存。在应用程序启动时,需要设置 MSP 的值以指向正确的堆栈区域。通常情况下,MSP 的值应该是用户代码区的第一个字,即存储栈顶地址的位置。

    在你提供的代码中,应用程序的堆栈指针初始化的代码被注释掉了。因此,在应用程序中的堆栈指针可能没有正确初始化,导致跳转失败。

    如果去掉 __set_MSP( * ( __IO uint32_t * ) App_Addr ); 这句话后,应用程序可以正常跳转,则说明在应用程序中堆栈指针已经被正确初始化。此时,不需要再执行初始化堆栈指针的代码。

    建议在应用程序中确保堆栈指针正确初始化后再跳转到应用程序。如果堆栈指针未正确初始化,则应用程序可能无法正常运行,或者发生异常和错误。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月23日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?