IAP Bootloader не может загрузить образ приложения RTX
Я разделил программное обеспечение на две части: загрузчик (без RTX), образ приложения с RTX. Но загрузчик не смог загрузить образ приложения с RTX. Настройки Flash:
-------------------------------------------------- ------------------ размер начального адреса IROM 1: 0x08000000 0x2800 - загрузчик (без RTX) IROM 2: 0x08002800 0xD000 - Образ приложения (с RTX)
У меня есть тест 3 способа: (1) Использовать другое приложение без RTX. Загрузчик может успешно загрузить приложение.
(2) Измените приложение с настройкой IROM проекта RTX. Я изменяю начальный адрес проекта приложения IROM с 0x08002800 на 0x08000000. И я загружаю изображение приложения во флэш-память с адреса 0x08000000. Изображение может успешно запускаться с 0x08000000.
(3) Установка начального адреса IROM образа приложения - 0x08002800. Загрузив загрузчик и образ приложения во флэш-память, я пошагово отлаживаю проект приложения. Я обнаружил, что существует ошибка "переполнение стека osTimerthread". Тогда стек основного потока также переполняется. Я попытался увеличить размер стека, но это не работает. Я обнаружил, что приложение запускается при переключении ядра RTX. Все потоки находятся в состоянии ожидания и не работают.
Ps, когда я отлаживаю в keil, тестовый элемент (2) также имеет ошибки переполнения стека во время инициализации ядра. Пункт (2) отлично работает до сих пор. Поэтому я просто поместил любую необходимую информацию здесь.
1 ответ
Вы на самом деле меняете скрипт компоновщика на ссылку, начиная с 0x08002800
при использовании загрузчика или просто загрузки приложения (ссылка на 0x08000000
) со смещением 0x2800
? Дважды проверьте это (посмотрите в файле карты) для вашего связанного вывода, чтобы убедиться, что все ваши символы не связаны в 0x08000000 - 0x08002800
спектр.
Кроме того, убедитесь, что вы используете правильную точку входа и указатель стека. Указатель стека приложения должен быть на 0x08002800
и вектор сброса будет в 0x08002804
, Ваш загрузчик должен будет настроить MSP
зарегистрироваться с правильным указателем стека, прежде чем перейти к приложению. Вот пример кода из загрузчика STF USB DFU:
typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD); JumpToApplication();
Кроме того, в зависимости от того, сколько ваш загрузчик настраивает перед тем, как перейти к приложению, вам может потребоваться "отключить" определенные периферийные устройства. Например, если вы настроили свои часы в загрузчике, прежде чем перейти к приложению, вы можете столкнуться с проблемами в вашем приложении, если предполагается, что часы уже находятся в конфигурации по умолчанию. Подобные вещи могут случиться с NVIC и SysTick, если ваш загрузчик использует их до перехода в приложение.
Наконец, в том же ключе, что и в предыдущем разделе, приложение может делать предположения о состоянии периферийных устройств по умолчанию, но оно также может делать предположения о том, что периферийные настройки по умолчанию являются правильными. Например: SCB->VTOR
имеет значение по умолчанию (я считаю, что это всегда 0x00000000
), и это указывает на векторную таблицу. Ваш загрузчик будет связан с его векторной таблицей в этом месте. Вам нужно убедиться, что при запуске приложения оно обновляет VTOR
зарегистрироваться, чтобы указать фактическое местоположение своей таблицы векторов.
Надеюсь, один из этих разделов поможет вам определить проблему.