Я создал приложение, которое имеет 2 слота прошивки в своем отображении памяти.Он работает довольно хорошо, и оба слота выполнены правильно на основе 32-битного номера секвенсора, хранящегося во FLASH.
Проблема возникает, когда я пытаюсь использовать FreeRTOS.По умолчанию прошивка скомпилирована для первого слота ... и нет проблем с запуском этого слота.Однако, когда устройство запускает прошивку, сохраненную во втором слоте, когда RTOS запускает свою первую задачу в prvPortStartFirstTask , затем переходит к vPortSVCHandler , оно переключается на задачу в первом слоте.
Что я делаю не так?Я думал, что адреса функций после компиляции являются относительными, поэтому не должно быть трудностей при запуске этого приложения с двумя слотами прошивки.
EDIT
Мой поток при переключении с загрузчика на основное приложение выглядит так:следует: 1. Проверить, какой слот прошивки следует использовать.2. Отключите IRQ.2. Скопируйте векторную таблицу в RAM.Эта часть оперативной памяти одинакова для обоих слотов.В процессе копирования я меняю смещение для каждого адреса, чтобы они были совместимы с конкретным слотом прошивки.По умолчанию адреса не имеют смещения, они удаляются на этапе посткомпиляции.3. Установите указатель стека в соответствии с первым словом в таблице векторов в ОЗУ.Эти адреса не изменяются при копировании таблицы векторов в ОЗУ.4. Установите SCB-> VTOR.5. Выполните Барьер синхронизации данных DSB ().6. Перейдите к обработчику сброса из таблицы векторов, скопированной в ОЗУ.
РЕДАКТИРОВАТЬ 2
Когда я компилирую приложение с измененным диапазоном адресов памяти FLASH во вторичный слот, оно работает правильно.Возможно ли скомпилировать код так, чтобы приложение было независимым от ПК, по крайней мере, в этом случае оно будет работать?
EDIT 3
# Generate position independent code.
-fPIC
# Access bss via the GOT.
-mno-pic-data-is-text-relative
# GOT is not PC-relative; store GOT location in a register.
-msingle-pic-base
# Store GOT location in r9.
-mpic-register=r9
Однако теперь этот слот перестал работать.
Я думаю, что моя проблема похожа на эту один .