我正在使用stm32f4发现板,并尝试跳转到闪存的一部分,在那里我将开始执行另一个程序there.The变量ApplicationAddress为0x08008000。当我的代码到达这一部分时,PC转到0x0000000,系统冻结。我不确定到底发生了什么。谢谢您抽时间见我。我的跳转代码如下所示。
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();发布于 2013-05-11 06:37:31
假设您发布的代码实际上使用了MSP堆栈,所以当您执行以下命令时:
__set_MSP(*(__IO uint32_t*) ApplicationAddress);这个堆栈被丢弃了,如果Jump_To_Application变量是一个局部变量(如果它是一个局部变量,那么它可能已经在堆栈上了--特别是如果您正在运行一个非优化/调试构建),那么它可能会突然变得垃圾。
为了解决这个问题,我使用了:
void LoadStackAndGo( void* sp, void* entry)
{
__asm (
"mov sp, r0 \n"
"mov pc, r1 \n"
);
}它应该可以很容易地适应你正在使用的工具链。
发布于 2016-10-21 19:22:51
我也遇到了同样的问题,不过我的解决方案是:
__set_MSP (*(__IO uint32_t*)ApplicationAddress);__set_PSP (*(__IO uint32_t*)ApplicationAddress);
并将函数指针声明为静态...
static Function jumpToApplication = (Function) * (__IO uint32_t*)(ApplicationAddress + 4);https://stackoverflow.com/questions/16490315
复制相似问题