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) отлично работает до сих пор. Поэтому я просто поместил любую необходимую информацию здесь.

Это картина отладки для элемента (3).

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 зарегистрироваться, чтобы указать фактическое местоположение своей таблицы векторов.

Надеюсь, один из этих разделов поможет вам определить проблему.

Другие вопросы по тегам