STM32 IAP Application Jump Условие перехода не выполнено
У меня есть загрузочный код на 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. Что хранится в этом адресе памяти и каким он должен быть в норме?
1 ответ
Это таблица векторов, которая расположена по этим адресам (в 0x08000000
для загрузчика и при 0x08060000
для применения соответственно). Первое значение, сохраненное в таблице векторов, является значением сброса указателя стека.
Вы можете проверить эту ссылку для получения дополнительной информации: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html
Почему вы хотите проверить это значение таким образом, можно только догадываться. Скорее всего, это будет своего рода проверка безопасности, чтобы увидеть, может ли быть загружено действительное приложение. Это определенно недостаточно и не гарантирует много (например, может быть загружена половина приложения). Это также полностью зависит от вашей структуры памяти и от того, где в RAM вы решаете разместить свой стек. Я предполагаю, что вы скопировали (или сгенерировали) некоторую часть кода, ответственного за макет памяти в вашем приложении, а затем скопировали - из другого источника - эту часть кода, которая имеет проверку. Эти двое, вероятно, не будут работать вместе очень хорошо.