GD32E5VCT6 IAP跳转失败

[复制链接]
7044|18
手机看帖
扫描二维码
随时随地手机跟帖
loala|  楼主 | 2022-4-7 16:48 | 显示全部楼层 |阅读模式
最小的IAP程序,只执行跳转到APP程序,跳不过去。

#define APP_START_ADDRESS   0x08008000
typedef  void (*pFunction)(void);
void JumpToApplication(__IO uint32_t Addr)
{
        pFunction Jump_To_Application;
        __IO uint32_t JumpAddress;
        /* Test if user code is programmed starting from address "ApplicationAddress" */
        if (((*(__IO uint32_t*)Addr) & 0x2FF00000 ) == 0x20000000)
        {
          /* Jump to user application */
          JumpAddress = *(__IO uint32_t*) (Addr + 4);
          Jump_To_Application = (pFunction) JumpAddress;
        
          __set_MSP(*(__IO uint32_t*)Addr);
          Jump_To_Application();
        }
}
/*********************************************************************************************************
** Function name:       Run_App
** Descriptions:        跳转到APP运行
** input parameters:    无
** Output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void Run_App(void)
{
    if((*((uint32_t *)APP_START_ADDRESS)!=0xFFFFFFFF))//运行APP
    {
        JumpToApplication(APP_START_ADDRESS);       
    }
}

int main(void)
{
    while (1){
        Run_App();/*跳转到APP运行*/       
    }
}

使用特权

评论回复
CharryW| | 2022-4-7 18:36 | 显示全部楼层
pFunction Jump_To_Application;

使用特权

评论回复
CharryW| | 2022-4-7 18:36 | 显示全部楼层
CharryW 发表于 2022-4-7 18:36
pFunction Jump_To_Application;

这个建议定义成全局的,这里定义局部的,后面又重设MSP指针那地址不就变了吗?

使用特权

评论回复

评论

CharryW 2022-4-8 14:18 回复TA
@Prry :你测试下就知道了,你的函数指针是局部的,在stack里,通过msp来指向,但跳转前重新设置了MSP就导致地址变化了,这个时候函数指针本身的地址就变了而不是指向地址变了。 
Prry 2022-4-8 00:12 回复TA
不需要,这个是函数指针,指向需要跳转的App地址,地址是绝对的,问题不在这里。 
sonicll| | 2022-4-7 18:54 | 显示全部楼层
本帖最后由 sonicll 于 2022-4-7 18:55 编辑

pFunction Jump_To_Application;
需要放在函数外面定义成全局变量,否则你定义成临时变量的话,临时变量的值是放在栈里的,你在跳转之前修改了MSP,从栈里取到的跳转地址会出错

使用特权

评论回复

评论

sonicll 2022-4-8 08:52 回复TA
@Prry :你自己找个板子把楼主的代码跑一下就知道了,修改过MSP之后,Jump_To_Application的值就变了,不信你试试 
Prry 2022-4-8 00:13 回复TA
不需要,这个是函数指针,指向需要跳转的App地址,地址是绝对的,问题不在这里。 
chenqianqian| | 2022-4-8 07:47 | 显示全部楼层
楼上正解

使用特权

评论回复
sanzi666| | 2022-4-8 13:35 | 显示全部楼层
这是回调函数应用吗,
JumpAddress = *(__IO uint32_t*) (Addr + 4);//这句的意思是把该Addr+4这个值强转成指针,再取该地址里面的数字赋予JumpAddress,对不?
          Jump_To_Application = (pFunction) JumpAddress;//这句是什么意思,能给讲讲不
        
          __set_MSP(*(__IO uint32_t*)Addr);//这是调用了__set_MSP这个函数,对吗
          Jump_To_Application();//这句调用这个函数,这个函数的内容是什么呢,也是没有看明白,,
以上希望有高手给讲讲,,

使用特权

评论回复
ddxx| | 2022-4-11 20:43 | 显示全部楼层
__set_MSP重置了堆栈

使用特权

评论回复
e_007| | 2022-4-13 18:44 | 显示全部楼层
本帖最后由 e_007 于 2022-4-13 18:48 编辑

...

使用特权

评论回复
diweo| | 2022-4-16 08:23 | 显示全部楼层
只设了MSP,没有重设向量表,应该不行吧

使用特权

评论回复
tpgf| | 2022-5-1 18:13 | 显示全部楼层
卡在哪里了啊

使用特权

评论回复
晓伍| | 2022-5-1 18:16 | 显示全部楼层
我没看明白程序呀

使用特权

评论回复
八层楼| | 2022-5-1 18:27 | 显示全部楼层
指针操作很容易出问题的

使用特权

评论回复
观海| | 2022-5-1 18:40 | 显示全部楼层
没看出来是回调函数啊

使用特权

评论回复
guanjiaer| | 2022-5-1 19:01 | 显示全部楼层
请问MSP是什么啊

使用特权

评论回复
heimaojingzhang| | 2022-5-1 19:47 | 显示全部楼层
如何充值堆栈啊

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则