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

问题描述 投票:0回答:1

我的引导代码为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检查起始地址的内容。存储在此内存地址中的内容以及通常应该是什么?

memory stm32 bootloader remap
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.