不满足STM32 IAP应用程序跳转条件



我在0x08000000有一个启动代码,在0x08060000有一个应用程序代码。如果我注释掉如下所示的条件检查,我可以从启动代码跳转到应用程序:

//if (( (*(__IO uint32_t*)0x08060000) & 0x2FFE0000 ) == 0x20000000)
{
JumpAddress = *(__IO uint32_t*)( 0x08060000 + 4 );
Jump_To_Application = (pFunction)JumpAddress;
__set_MSP( *(__IO uint32_t*)0x08060000 );
Jump_To_Application();
}

条件不满足,因为左侧等于0x20020000。我不明白为什么它是0x20020000而不是0x20000000。

为什么我们要用0x20000000检查起始地址的内容。此内存地址中存储了什么,通常应该存储什么?

它是一个位于这些地址的向量表(分别位于引导加载程序的0x08000000和应用程序的0x08060000处(。存储在向量表中的第一个值是堆栈指针的重置值。

您可以查看此链接以获取更多信息:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html

为什么要以这种方式检查此值,只能猜测。它很可能充当一种安全检查,以查看是否可能加载了有效的应用程序。这绝对是不够的,也不能保证太多(例如,可能会加载一半的应用程序(。这也完全取决于您的内存布局以及您决定在 RAM 中放置堆栈的位置。我假设您复制粘贴(或生成(了应用程序中负责内存布局的代码的某些部分,然后从另一个来源复制粘贴了具有相关检查的这部分代码。这两者可能不会很好地协同工作。

相关内容

最新更新