STM32 IAP 应用跳转条件不满足
STM32 IAP Application Jump Condition Not Satisfied
我在 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起始地址的内容。这个内存地址存储了什么,正常情况下应该是什么?
它是一个向量 table,位于这些地址(分别位于 0x08000000
用于引导加载程序和 0x08060000
用于应用程序)。向量中存储的第一个值table是堆栈指针的重置值。
您可以查看此 link 了解更多信息:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html
为什么您要以这种方式检查此值,您可能只能猜测。它很可能作为一种安全检查来查看是否 可能 加载了有效的应用程序。这绝对是不够的,也不能保证太多(例如,可能会加载一半的应用程序)。它还完全取决于您的内存布局以及您决定在 RAM 中放置堆栈的位置。我假设您复制粘贴(或生成)了应用程序中负责内存布局的部分代码,然后从另一个来源复制粘贴了这部分代码,其中包含有问题的检查。这两者可能无法很好地协同工作。
我在 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起始地址的内容。这个内存地址存储了什么,正常情况下应该是什么?
它是一个向量 table,位于这些地址(分别位于 0x08000000
用于引导加载程序和 0x08060000
用于应用程序)。向量中存储的第一个值table是堆栈指针的重置值。
您可以查看此 link 了解更多信息:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html
为什么您要以这种方式检查此值,您可能只能猜测。它很可能作为一种安全检查来查看是否 可能 加载了有效的应用程序。这绝对是不够的,也不能保证太多(例如,可能会加载一半的应用程序)。它还完全取决于您的内存布局以及您决定在 RAM 中放置堆栈的位置。我假设您复制粘贴(或生成)了应用程序中负责内存布局的部分代码,然后从另一个来源复制粘贴了这部分代码,其中包含有问题的检查。这两者可能无法很好地协同工作。