簡體   English   中英

Stm32f4內存跳躍

[英]Stm32f4 Memory Jumping

我正在使用stm32f4發現板,並且嘗試跳到Flash的一部分,在那里我將開始執行另一個程序。變量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();

大概您在問題中發布的代碼實際上是在使用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"
    );
}

應該可以輕松地適應您正在使用的任何工具鏈。

我遇到了完全相同的問題,但是我的解決方案是:

__set_MSP (*(__IO uint32_t*)ApplicationAddress);

__set_PSP (*(__IO uint32_t*)ApplicationAddress);

並將函數指針聲明為靜態...

static Function jumpToApplication = (Function) * (__IO uint32_t*)(ApplicationAddress + 4);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM