STM32 IAP Application Jump Условие перехода не выполнено - PullRequest
0 голосов
/ 28 августа 2018

У меня есть загрузочный код по адресу 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 Ответ

0 голосов
/ 28 августа 2018

Это векторная таблица, которая расположена по этим адресам (0x08000000 для загрузчика и 0x08060000 для приложения соответственно). Первым значением, сохраненным в таблице векторов, является значение сброса указателя стека.

Вы можете проверить эту ссылку для получения дополнительной информации: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html

Почему вы хотите проверить это значение таким образом, можно только догадываться. Скорее всего, это будет своего рода проверка безопасности, чтобы увидеть, может ли быть допустимым загруженным приложением. Это определенно не достаточно и не гарантирует много (например, может быть загружена половина приложения). Это также зависит полностью от вашей структуры памяти и от того, где в RAM вы решаете разместить свой стек. Я предполагаю, что вы скопировали (или сгенерировали) некоторую часть кода, ответственного за макет памяти в вашем приложении, а затем скопировали - из другого источника - эту часть кода, которая имеет проверку. Эти двое, вероятно, не будут хорошо работать вместе.

...