[英]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.