关于#单片机#的问题:gd32 bootloader里__set_MSP作用

gd32 bootloader里__set_MSP作用

typedef void (*Jump_Fun)(void); 
Jump_Fun JumpToApp;
void IAP_ExecuteApp (uint32_t address)
{    
 // 检查栈顶是否合法,,确保栈顶落在0x2000 0000 - 0x2000 1FFF 之间,刚好在GD32E230的RAM范围内    
    if ( ( ( * ( __IO uint32_t * ) address ) & 0x2FFE0000 ) == 0x20000000 )    //检查栈顶地址是否合法.
    { 
          if (((*(__IO uint32_t*)(address + 4)) & 0x8FE0000 ) == 0x08000000 ) 
            { usart_disable(USART0);    
        JumpToApp =(Jump_Fun) * ( __IO uint32_t * )(address + 4);                //用户代码区第二个字为程序开始地址(复位地址)        
        __set_MSP( * ( __IO uint32_t * ) address );                                //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
        JumpToApp();                                                 //跳转到APP.
            }
            
    }
}

但如果改成Jump_Fun JumpToApp这句放进去下面这样就无法跳转,但下面这种删去__set_MSP( * ( __IO uint32_t * ) address )这句又能跳转了,请问为什么会发生这种现象?


typedef void (*Jump_Fun)(void); 

void IAP_ExecuteApp (uint32_t address)
{    
 // 检查栈顶是否合法,,确保栈顶落在0x2000 0000 - 0x2000 1FFF 之间,刚好在GD32E230的RAM范围内    
//        uint32_t JumpAddress;
    if ( ( ( * ( __IO uint32_t * ) address ) & 0x2FFE0000 ) == 0x20000000 )    //检查栈顶地址是否合法.
    { 
                  Jump_Fun JumpToApp;
          if (((*(__IO uint32_t*)(address + 4)) & 0x8FE0000 ) == 0x08000000 ) 
            { usart_disable(USART0);    
        JumpToApp =(Jump_Fun) * ( __IO uint32_t * )(address + 4);                //用户代码区第二个字为程序开始地址(复位地址)        
        __set_MSP( * ( __IO uint32_t * ) address );                                //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
        JumpToApp();                                                 //跳转到APP.
            }
            
    }
}

其实注释已经解释得很清楚了