首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Stm32f4内存跳转

Stm32f4内存跳转
EN

Stack Overflow用户
提问于 2013-05-11 04:27:58
回答 2查看 6.2K关注 0票数 2

我正在使用stm32f4发现板,并尝试跳转到闪存的一部分,在那里我将开始执行另一个程序there.The变量ApplicationAddress为0x08008000。当我的代码到达这一部分时,PC转到0x0000000,系统冻结。我不确定到底发生了什么。谢谢您抽时间见我。我的跳转代码如下所示。

代码语言:javascript
复制
    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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-11 06:37:31

假设您发布的代码实际上使用了MSP堆栈,所以当您执行以下命令时:

代码语言:javascript
复制
__set_MSP(*(__IO uint32_t*) ApplicationAddress);

这个堆栈被丢弃了,如果Jump_To_Application变量是一个局部变量(如果它是一个局部变量,那么它可能已经在堆栈上了--特别是如果您正在运行一个非优化/调试构建),那么它可能会突然变得垃圾。

为了解决这个问题,我使用了:

代码语言:javascript
复制
void LoadStackAndGo( void* sp, void* entry)
{
    __asm (
        "mov sp, r0 \n"
        "mov pc, r1 \n"
    );
}

它应该可以很容易地适应你正在使用的工具链。

票数 4
EN

Stack Overflow用户

发布于 2016-10-21 19:22:51

我也遇到了同样的问题,不过我的解决方案是:

代码语言:javascript
复制
__set_MSP (*(__IO uint32_t*)ApplicationAddress);

__set_PSP (*(__IO uint32_t*)ApplicationAddress);

并将函数指针声明为静态...

代码语言:javascript
复制
static Function jumpToApplication = (Function) * (__IO uint32_t*)(ApplicationAddress + 4);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16490315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档