有个问题要注意一下
编译时至少要开启-O1或更高级的优化
如果采用-O0来禁用优化,IAP_JumpToApp会无法跳转,原因见下面的注释
int IAP_JumpToApp(uint32_t u32Addr)
{
uint32_t u32StackTop = *((__IO uint32_t *)u32Addr); //读取APP程序栈顶地址
LogV(TAG,"u32StackTop=%p",u32StackTop);
/* 判断栈顶地址有效性 */
if ((u32StackTop > SRAM_BASE) && (u32StackTop <= (SRAM_BASE + RAM_SIZE)))
{
/* 配置跳转到用户程序复位中断入口 */
JumpAddress = *(__IO uint32_t *)(u32Addr + 4);
JumpToApplication = (func_ptr_t)JumpAddress;
LogV(TAG,"JumpAddress=%p",JumpAddress);
/* 初始化用户程序的栈顶指针 */
__set_MSP(*(__IO uint32_t *)u32Addr);
/*
注意上面的__set_MSP会修改sp,
而如果采用-O0来编译运行时,下面的JumpToApplication()会从sp偏移取JumpToApplication变量
导致访问到错误的地址从而进入HardFault_Handler,导致没法跳转到hdapp
*/
JumpToApplication();
}
return 0;
}
|